Repository 단위테스트
Ropsitory
- 서비스에서 엔티티의 영속화를 위해서 Repository를 호출한다.
- 이렇게 Repository 의 기능만을 테스트 하기위해서는 Service와의 결합을 끊어야 한다.
- SpringBoot 테스트는 @DataJpaTest Annottation을 제공하는데, 이것을 통해 Repository의 단위 테스트가 가능하다.
@DataJpaTest
- persistence layer 를 슬라이스 테스트하기 위한 각종 자동 설정을 지원한다.
- @DataJpaTest 테스트는 저장을 위한 JPA 연관 관계가 적절히 구성되었는지, Repository 메서드가 제대로 구현되었는지 확인하는 것이 목적이다.
- JPA 관련된 설정만 로드한다.
- WebMVC와 관련된 Bean이나 기능은 로드되지 않는다.
- JPA를 사용해서 생성/조회/수정/삭제 기능의 테스트가 가능하다.
- 아래와 같이 @Transactional을 기본적으로 내장하고 있으므로, 매 테스트 코드가 종료되면 자동으로 DB가 롤백된다.
- 또한 @ExtendWith( SpringExtension.class) 어노테이션을 가지고 있어서, 이 어노테이션만 붙여주면 된다.
- 잘 사용하는 세부 기능
- TestEntityManager: 테스트 데이터를 주입할 EntityManager 를 사용한다.
- @AutoConfigureTestDatabase: 테스트용 인메모리 DB 를 다른 환경으로 바꾸고자 할 때 사용한다.
- @Transactional 기능이 필요하지 않으면 @Transactional(propagation = Propagation.NOT_SUPPORTED) 설정하면 된다.
- @Entity가 선언된 클래스를 스캔하여 저장소를 구성한다.
- 테스트에 사용할 DB를 직접 지정하려면 다음 애노테이션을 추가할 수도 있다.
@AutoConfigureTestDatabase(replace = AutoConfigureTestDatabase.Replace.NONE)
- @AutoConfigureTestDatabase Default 설정 값은 Any이다.
- 기본적으로 내장된 데이터소스를 사용한다.
- @ActiveProfiles("test") 등의 프로파일이 설정도 가능하다.
- 일반적인 다른 컴포넌트들은 스캔하지 않는다. 따라서 특정 bean의 의존성이 필요한 경우 아래의 방법 사용
- @import
- @DataJpaTest(includeFilters = @Filter(..))
예제
@DataJpaTest
@AutoConfigureTestDatabase(replace = AutoConfigureTestDatabase.Replace.NONE)
@DisplayName("고객 DB Test")
class CustomerRepositoryTest {
@Autowired
private CustomerRepository customerRepository;
@Autowired
private TestEntityManager testEntityManager;
@DisplayName("")
@Test
void test() {
//given
User user = User.builder()
.userNm("채현욱")
.loginId("testManager")
.loginPwd("122")
.userTp(UserType.MANAGER)
.activated(true)
.build();
Customer customer = Customer.builder()
.custNm(user.getUserNm())
.useYn(false)
.user(user)
.build();
testEntityManager.persist(user);
testEntityManager.persist(customer);
//when
List<Customer> all = customerRepository.findAll();
Optional<Customer> customerByUser = customerRepository.findCustomerByUser(user);
//then
assertThat(all).hasSize(41);
assertThat(customerByUser.get().getUser().getUserNm()).isEqualTo("채현욱");
}
}
REFERENCES
'Junit' 카테고리의 다른 글
단위테스트 vs 통합테스트 (0) | 2022.02.27 |
---|---|
Service 단위테스트 (0) | 2022.02.27 |
MockMvc (0) | 2022.02.27 |
Mockito (0) | 2022.02.27 |
Junit5 애노테이션 비교 (0) | 2022.02.27 |