백엔드/JPA

JUnit5 Repository 테스트 하기

infitry 2022. 8. 5. 20:17
반응형

요즘 TDD를 조금 씩 실천해보고 있는 와중 이것 저것 해보다, JPA Repository테스트를 

좀 더 가볍게 진행하기 위해 @DataJpaTest 어노테이션을 사용해 보았습니다.

@DataJpaTest 어노테이션을 사용하게 되면 장점은

  1. JPA 관련 테스트 설정만 로드하게 된다.
  2. 1번의 이유로 테스트가 좀 더 가벼워 진다.
  3. 내장형 인메모리 DB를 사용하여 실제 데이터 베이스를 사용하지 않고 테스트 할 수 있다.
  4. 기본 적으로 @Transactional 어노테이션을 포함하고 있다. 테스트가 끝난 후 롤백된다.

가 있고, 테스트 시에는 다른 DB를 사용하고 싶다면, test/resources/application.yml 파일을 만든 후 datasource를 설정합니다.

 

// application.yml

spring:
  jpa:
    hibernate:
      ddl-auto: create-drop
    properties:
      hibernate:
        format_sql: true
    show-sql: true
    defer-datasource-initialization: true
  datasource:
    url: jdbc:h2:~/test
    driverClassName: org.h2.Driver
    username: sa
    password:

이렇게 테스트 용 application.yml을 설정 한 후

 

// UserRepositoryTest.java

@DataJpaTest
@Import({TestConfig.class, TestJPAConfig.class})
class UserRepositoryTest {

 

@DataJpaTest 어노테이션을 붙여줍니다.

@Import는 스프링에서 제공하는 어노테이션인데, 설정 파일을 포함 할 수 있습니다.

해당 테스트에서 설정 파일을 포함한 이유는 Entity에 포함 된 JPA Auditing 설정과 추가적으로 Spring Security의 PasswordEncoder 를 Bean으로 등록하기 위함 입니다.

추가적으로 등록해야 할 Bean이 있을 시 포함되는 @Configuration에 Bean을 등록합니다.

 

// TestJPAConfig.java

@EnableJpaAuditing
@TestConfiguration
public class TestJPAConfig {
}

// TestConfig.java

@TestConfiguration
public class TestConfig {

    @Bean
    public PasswordEncoder passwordEncoder() {
        return new BCryptPasswordEncoder();
    }
}

 

이렇게 설정 후 UserRepositoryTest.java 로 테스트 코드를 작성 해보면,

@DataJpaTest
@Import({TestConfig.class, TestJPAConfig.class})
class UserRepositoryTest {

    @Autowired
    UserRepository userRepository;
    @Autowired
    PasswordEncoder passwordEncoder;

    @Test
    public void 사용자_생성() {
        // given
        String username = "test1";
        User saveUser = User.createUser(Authority.ROLE_USER, username, "name1", passwordEncoder.encode("password1"));
        userRepository.save(saveUser);
        // when
        User findUser = userRepository.findById(username).orElseThrow(NoSuchElementException::new);
        // then
        assertEquals(saveUser.getUsername(), findUser.getUsername());
    }
}

 

정상적으로 동작합니다~

 

반응형