모르지 않다는 것은 아는것과 다르다.

Junit

Repository 단위테스트

채마스 2022. 2. 27. 01:42

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