[Springboot-junit] - JPA 테스트/@DataJpaTest

  • springboot 2.5 + junit5
  • DB : mariadb:10.4.18

@DataJpaTest

// In-memory 기반 H2 사용
@DisplayName("Role 테스트 - H2")
@DataJpaTest
class RoleRepositoryH2Test {
    // @formatter:off    
    @Autowired
    RoleRepository roleRepository;

    @DisplayName("Role 등록/조회 테스트")
    @Test
    void test_1() {
        // given
        Role role = Role.builder()
                        .name("ROLE_USER")
                        .description("사용자")
                        .build();
        // when/then
        assertNotNull(roleRepository.save(role), "Role 등록 테스트");
        assertNotNull(roleRepository.findOneByName("ROLE_USER"), "Role 검색 테스트");
    }
}

실제 db 사용

  • @AutoConfigureTestDatabase(replace = Replace. NONE)
@DisplayName("Role 테스트 - Real db")
@DataJpaTest
@AutoConfigureTestDatabase(replace = Replace.NONE) // 실제 구성된 db 사용
class RoleRepositoryRealDbTest {
}

롤백 비활성화

  • @DataJpaTest에는 @Transactional 선언되어 있어 기본적으로 rollback 처리됨
  • @Rollback(false)
@DisplayName("Role 테스트 - Real db")
@DataJpaTest
@Rollback(false)
@ActiveProfiles("test")
@AutoConfigureTestDatabase(replace = Replace.NONE)
class RoleRepositoryRealDbTest {
}

Repository 를 사용하는 Class 테스트

@Import

  • 테스트에 사용하는 class에서 Repository를 사용하는 경우 @Import 어노테이션을 사용
@DisplayName("UserDetailsServiceEx - EntityManager")
@DataJpaTest
@ActiveProfiles("test")
@Import(UserDetailsServiceEx.class)
class UserDetailsServiceExTest {
}

그외

  • class에서 른 클래스가 autowired 되어 있지만 테스트 대상 기능/메소드에서는 해당 class를 사용하지 않는 경우 @MockBean을 사용
@Service
public class UserDetailsServiceEx implements UserDetailsService {
    @Autowired
    private UserRepository userRepository;

    @Autowired
    private TestService testService;
    ...
}

// 아래처럼 실제 TestService를 사용하지 않고 
@Import(UserDetailsServiceEx.class, TestService.class)

@DisplayName("UserDetailsServiceEx - EntityManager")
@DataJpaTest
@ActiveProfiles("test")
@Import(UserDetailsServiceEx.class)
class UserDetailsServiceExTest {
    // mockBean을 사용
    @MockBean
    TestService testService;
}

'spring' 카테고리의 다른 글

[개발환경] Ubuntu - jdk tar.gz 설치  (0) 2022.09.23
[Spring] properties 설정 분리(2)  (0) 2021.02.17
[Spring] properties 설정 분리(1)  (0) 2021.02.17
[Springboot-junit4] controller 테스트하기  (0) 2019.06.09
[spring] json 샘플  (0) 2017.06.27

+ Recent posts