게시글
질문&답변
TRACE 레벨의 로그가 찍히지 않는 것 같아요( 해결완료 )
해결 방법 1@Test @Transactional @Rollback(false) void testMember() { }테스트의 상단에 @RollBack(false) 애노테이션을 추가해주었더니 영한님의 로그와 동일하게 출력되었습니다.@Transactional 애노테이션을 메서드에 추가하면 테스트 완료 후 rollback이 일어나면서 실제로 db에 데이터를 저장하지 않기 때문에 insert 구문을 볼 수 없었던 것이라고 합니다.@Rollback(false) 를 추가해주면 테스트 완료 후 롤백을 하지 않으면서, 실제로 db에 데이터를 저장하게 되며 insert 문을 수행하게 됩니다.근데 이 경우 DB에 데이터가 남게 되어서 다음 테스트를 진행할 때 영향을 주는 문제가 발생합니다.해결 방법 2 (권장)package jpabook.jpashop; import jakarta.persistence.EntityManager; import jakarta.transaction.Transactional; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.test.annotation.Rollback; import static org.assertj.core.api.Assertions.assertThat; @SpringBootTest class MemberRepositoryTest { @Autowired MemberRepository memberRepository; @Autowired private EntityManager entityManager; @Test @Transactional void testMember() { //given Member member = new Member(); member.setUsername("memberA"); //when Long savedId = memberRepository.save(member); Member findMember = memberRepository.find(savedId); //then assertThat(findMember).isEqualTo(member); // entityManager.flush(); entityManager.clear(); } }다음과 같이 기존 코드에서 EntityManager 를 추가하여 직접 flush() 하게 되면 트랜잭션이 커밋되지 않아도 INSERT 문이 실행되고, 테스트가 끝나면 @Transactional 에 의해서 롤백되므로 DB에는 반영되지 않습니다.즉, 트랜잭션 내에서 SQL 로그를 모두 확인하면서도 테스트를 독립적으로 실행할 수 있습니다.
- 0
- 2
- 125
질문&답변
MemoryMemberRepository를 2번 선언해도 테스트 결과가 정상인 이유?
MemoryMemberRepository 클래스 내부에서 HashMap을 static으로 선언해두었네요.MemoryMemberRepository의 구현체는 2개가 생성되는 것이 맞지만 store를 내부적으로 공유하기 때문에 가능한 것이었네욥 궁금증 해결했습니다~
- 0
- 2
- 99