@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란?
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 |