[SpringBoot] DataJpaTest

애이용·2021년 6월 2일
1

springboot

목록 보기
19/20
post-thumbnail

@DataJpaTest

  • JPA에 필요한 클래스들만 로딩이 되어 좀 더 빠르게 테스트를 할 수 있다.
    • @Entity 어노테이션이 붙은 클래스
    • Spring Data JPA repository
  • DataSource의 설정이 정상적인지, JPA를 사용하여 데이터를 제대로 생성, 수정, 삭제하는지의 테스트가 가능하다.
  • @Transactional 어노테이션을 포함하고 있다. (테스트 완료되면 자동 Rollback)
  • 실제 데이터베이스에 테스트를 하고 싶은 경우 @AutoConfigureTestDatabase 어노테이션의 속성을 주면, 인메모리 데이터베이스가 아닌 실제 데이터베이스에 테스트가 가능하다.
    • @AutoConfigureTestDatabase 어노테이션은 기본적으로 내장된 임베디드 데이터베이스를 사용한다. (실제로 DataJpaTest 어노테이션을 사용할 경우에는 기본적으로 인메모리 데이터베이스가 존재해야 한다.)
    • Replace.NONE으로 설정하면 실제 데이터베이스에 테스트가 가능하다.
import static org.assertj.core.api.Assertions.assertThat;

// ... 생략

@DataJpaTest
@AutoConfigureTestDatabase(replace = AutoConfigureTestDatabase.Replace.NONE)
public class UserRepositoryTest {

    @Autowired
    private UserRepository userRepository;

    @Test
    void 유저_저장_테스트() {
        // given
        User user = User.builder()
                .name("테스트")
                .email("test@gmail.com")
                .age(22)
                .build();
                
        // when
        userRepository.save(user);

        // then
        assertThat(userRepository.findByName(user.getName()).isPresent()).isEqualTo(true);
    }
}

JPA 관련이 아닌 의존성 주입이라면 @ExtendWith(SpringExtension.class)가 필요하다.
(JUnit5 : @ExtendWith, JUnit4 : @RunWith)

ExtendWith(SpringExtension.class)

JUnit5에서는 @RunWith 대신에 @ExtendWith(SpringExtend.class)을 사용한다.
@SpringBootTest를 사용하면 모든 application context를 다 로딩하게 되는데
@ExtendWith(SpringExtend.class)를 사용한다면,
@Autowired, @MockBean에 해당되는 것들에만 application context를 로딩하게 된다.

이는 Service 테스트에서 정리하겠다.

MockBean은 @DataJpaTest에서도 테스트 통과된다.

profile
로그를 남기자 〰️

0개의 댓글