@DataJpaTest
@DisplayName("User Entity JPA 테스트")
class UserTest {
@Autowired
private TestEntityManager entityManager;
PasswordEncoder passwordEncoder = new BCryptPasswordEncoder();
@Test
@DisplayName("유저 저장 시 아이디, 비밀번호, role이 일치해야 한다 / 비밀번호는 Encode 해서 저장")
void 유저_저장_성공() {
// Given
String username = "username";
String rawPassword = "password";
String encodedPassword = passwordEncoder.encode(rawPassword);
UserRoleEnum role = UserRoleEnum.USER;
// When
User savedUser = entityManager.persistFlushFind(new User(username, encodedPassword, role));
// Then
Assertions.assertEquals(username, savedUser.getUsername());
Assertions.assertTrue(passwordEncoder.matches(rawPassword, encodedPassword));
Assertions.assertEquals(role, savedUser.getRole());
}
@Test
@DisplayName("유저 저장 시 username이 null이면 예외가 발생한다")
void 유저_저장_실패_username_null() {
// Given
String username = null;
String rawPassword = "password";
String encodedPassword = passwordEncoder.encode(rawPassword);
UserRoleEnum role = UserRoleEnum.USER;
// When & Then
Assertions.assertThrows(ConstraintViolationException.class, () ->
entityManager.persist(new User(username, encodedPassword, role))
);
}
@Test
@DisplayName("유저 저장 시 password가 null이면 예외를 반환한다")
void 유저_저장_실패_password_null() {
// Given
String username = "username";
String password = null;
UserRoleEnum role = UserRoleEnum.USER;
// When & Then
Assertions.assertThrows(ConstraintViolationException.class, () ->
entityManager.persist(new User(username, password, role))
);
}
}
Entity의 JPA에 대한테스트 코드를 짜봤는데 이때
TestEntityManager를 썼다
TestEntityManager란?
TestEntityManager (Spring Boot 3.2.0 API)
Refresh the state of the instance from the database, overwriting changes made to the entity, if any.
docs.spring.io
JPA를 테스트할 때 쓰는 클래스다
Persist나 Flush등을 하게 해주는 JPA 트랜잭션 관련 메소드를 제공해줘서 JPA 테스트를 할 때 용이하게 쓸 수 있다.
메소드는 다음과 같다
@DataJpaTest
Spring에서 JPA 관련 테스트 설정만 로드한다
기본적으로 트랜잭션 환경이 설정 되고 각 테스트가 끝나면 롤백된다.
내장된 메모리 내 데이터베이스를 사용하기에 쉽게 테스트 환경을 구현할 수 있다.
그래서 TestEntityManager를 쓸 때 persist등의 메소드를 쓸 수 있는 것이다.
'TIL' 카테고리의 다른 글
TIL 2023-12-07 Refresh Token 쓰는 이유 및 DB로 Redis를 쓰는 이유 (0) | 2023.12.07 |
---|---|
TIL 2023-12-06 jwt 로그인 시 unsuccessfulAuthentication로 계속 빠진다면? (0) | 2023.12.06 |
TIL 2023-12-01 Mockito any()를 쓰는 이유 (0) | 2023.12.01 |
TIL 2023-11-30 JUnit5 기본 문법 (0) | 2023.11.30 |
TIL 2023-11-29 단위 테스트 개념 정리 (0) | 2023.11.29 |