프로젝트 정리/스프링과 JPA 기반 웹 애플리케이션 개발

11. 회원 가입: 인증 메일 확인 테스트 및 리팩토링

출처 

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();
    }

}