-
Repository Layer의 단위테스트 작성Spring 2022. 3. 11. 17:19
비지니스 로직은 도메인 계층에서 발생하고, 엔티티의 영속화 요구는 서비스 계층에서 발생하기 때문에 Repository의 단독 테스트를 진행하기 위해서는 Service 계층과의 관계를 끊어야 한다.
SpringBoot에서는 @DataJpaTest 어노테이션을 통해서 JPA컴포넌트와 관련된 Repository의 단위테스트가 가능하도록 해준다.
@DataJpaTest
DataJpaTest 어노테이션은 JPA와 관련된 설정만을 로드하여 @Entity 어노테이션이 붙은 클래스를 스캔하여 저장소를 구성한다. 트랜잭션을 기본적으로 내장하고 있어 테스트 코드가 종료되면 자동으로 롤백이 이루어진다.
테스트 코드
@RunWith(SpringRunner.class) @DataJpaTest @AutoConfigureTestDatabase(replace = AutoConfigureTestDatabase.Replace.NONE) public class UserActivityRepositoryTests { @Autowired private UserActivityRepository userActivityRepository; @Test @DisplayName("주어진 정보대로 사용자 액티비티를 생성한다.") public void create_user_activity() { //given //when UserActivity createdUserActivity = userActivityRepository.save(userActivity); //then assertThat(createdUserActivity.getId()).isNotNull() } }
- @RunWith(SpringRunner.class) : @SpringBootTest를 사용하면 application context를 전부 로딩하기 때문에 무거워진다. 해당 어노테이션을 사용하면 Junit4에서 @Autowired, @MockBean에 해당하는 컨텍스트만 로딩하여 테스트를 진행하게 된다. (SpringJUnit4ClassRunner)
- @AutoConfigureTestDatabase : 설정의 기본값은 Replace.Any로 기본적으로 내장된 임베디드 데이터베이스를 사용하게된다. (인메모리 설정, h2 데이터베이스 사용됨) Replace.NONE으로 설정하면 우리가 사용하고자하는 데이터베이스가 사용이 된다. ( MySQL을 사용하기 때문에 해당 어노테이션을 사용했다. )
위와 같이 테스트 할 대상 레파지토리를 @Autowired 어노테이션을 통해서 빈으로 주입받고 주입받은 대상을 이용하여 테스트를 진행한다.
( 참고한 사이트 )
https://www.bezkoder.com/spring-boot-unit-test-jpa-repo-datajpatest/
https://ssons.tistory.com/63?category=959869
'Spring' 카테고리의 다른 글
Springboot와 React(Axios)에서 컨트롤러 prefix 수정하기 (0) 2022.05.30 PUT vs PATCH (0) 2022.03.21 테스트 진행시 @Value (application.properties.yml) 값을 읽지 못할 때 (NullPointerException) (1) 2022.03.04 Service 계층에서 다른 Service 혹은 Repository (2) 2022.03.04 ExistsBy쿼리를 직접 작성하기 (0) 2022.03.04