프로젝트 정리/스프링과 JPA 기반 웹 애플리케이션 개발
11. 회원 가입: 인증 메일 확인 테스트 및 리팩토링
JunGi Jeong
2021. 2. 25. 21:13
출처
www.inflearn.com/course/%EC%8A%A4%ED%94%84%EB%A7%81-JPA-%EC%9B%B9%EC%95%B1/dashboard
스프링과 JPA 기반 웹 애플리케이션 개발 - 인프런 | 강의
이 강좌에서 여러분은 실제로 운영 중인 서비스를 스프링, JPA 그리고 타임리프를 비롯한 여러 자바 기반의 여러 오픈 소스 기술을 사용하여 웹 애플리케이션을 개발하는 과정을 학습할 수 있습
www.inflearn.com
github.com/devjun63/whiteship-studyolle/commit/38ef4acc4bca22260348d00e9314ce31be729de1
11. 회원 가입: 인증 메일 확인 테스트 및 리팩토링 · devjun63/whiteship-studyolle@38ef4ac
checkEmailtoken & wrong_input_value testCase 작성 AccountController Refactoring
github.com
테스트
- 입력값이 잘못 된 경우
- error 프로퍼티가 model에 들어있는지 확인
- 뷰 이름이 account/checked-email 인지 확인
- 입력 값이 올바른 경우
- 모델에 error가 없는지 확인
- 모델에 numberOfUser가 있는지 확인
- 모델에 nickname이 있는지 확인
- 뷰 이름 확인
- 리팩토링
- 코드의 위치가 적절한가?
입력값이 잘못 된 경우
@DisplayName("인증 메일 확인 - 입력값 오류")
@Test //Junit5
void checkEmailToken_with_wrong_input() throws Exception {
mockMvc.perform(get("/check-email-token")
.param("token","ajioasdfj")
.param("email","email@email.com"))
.andExpect(status().isOk())
.andExpect(model().attributeExists("error"))
.andExpect(view().name("account/checked-email"));
}
입력 값이 올바른 경우
@DisplayName("인증 메일 확인 - 입력값 정상")
@Test //Junit5
void checkEmailToken() throws Exception {
Account account = Account.builder()
.email("test@email.com")
.password("12345678")
.nickname("devjun")
.build();
Account testAccount = accountRepository.save(account);
testAccount.generateEmailCheckToken();
mockMvc.perform(get("/check-email-token")
.param("token",testAccount.getEmailCheckToken())
.param("email",testAccount.getEmail()))
.andExpect(status().isOk())
.andExpect(model().attributeDoesNotExist("error"))
.andExpect(model().attributeExists("nickname"))
.andExpect(model().attributeExists("numberOfUser"))
.andExpect(view().name("account/checked-email"));
}
-> token이 account객체에 담기지 않는데 이는 전 강의와 마찬가지로
jpa의 영속성상태가 persist가 아닌 detach상태여서
테스트에서도 트랜잭션 어노테이션을 추가해 줘야 하기 때문이다.
@Transactional // 어노테이션 추가
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.DEFINED_PORT)
@AutoConfigureMockMvc
class AccountControllerTest {
리팩토링
AccountController에서 checkEmailToken{
......
account.setEmailVerified(true);
account.setJoinedAt(LocalDateTime.now());
model.addAttribute("numberOfUser", accountRepository.count());
model.addAttribute("nickname", account.getNickname());
}
->
AccountController에서 checkEmailToken{
......
account.completeSignup();
model.addAttribute("numberOfUser", accountRepository.count());
model.addAttribute("nickname", account.getNickname());
}
Account 클래스 {
public void completeSignup() {
this.emailVerified = true;
this.joinedAt = LocalDateTime.now();
}
}