백엔드/JPA
JUnit5 Repository 테스트 하기
infitry
2022. 8. 5. 20:17
반응형
요즘 TDD를 조금 씩 실천해보고 있는 와중 이것 저것 해보다, JPA Repository테스트를
좀 더 가볍게 진행하기 위해 @DataJpaTest 어노테이션을 사용해 보았습니다.
@DataJpaTest 어노테이션을 사용하게 되면 장점은
- JPA 관련 테스트 설정만 로드하게 된다.
- 1번의 이유로 테스트가 좀 더 가벼워 진다.
- 내장형 인메모리 DB를 사용하여 실제 데이터 베이스를 사용하지 않고 테스트 할 수 있다.
- 기본 적으로 @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());
}
}
정상적으로 동작합니다~
반응형