반응형
@AuthControllerTest 코드를 실행하는 중, 아래와 같은 오류 메시지가 발생하였다.
1. 소스 코드
- 로직은 다음과 같다.
- 먼저 컨트롤러로 nickname 중복 검증 요청이 오면, 공백과 문자열을 검증한 뒤, authService.check ... 메소드로 닉네임을 전달해서 db를 조회한 뒤, 결과를 int로 받아온다.
- Test 부분에서는 db에 저장되어 있지 않은 정상적인 닉네임 형식이 들어온 경우, 즉, HttpStatus.OK.value() 의 경우에 대해 검증하고자 하였다.
AuthController
@GetMapping(value = "/check-nickname")
public ResponseEntity<ApiResponse<?>> checkNicknameDuplicate(@RequestParam("nickname") String nickname) {
String pattern1 = "^[가-힣a-zA-Z0-9]*$"; // 특수문자, 공백 모두 체크 가능
if (nickname.replaceAll(" ", "").equals("")) { // 먼저 공백 확인
throw new CustomException(NICKNAME_CONTAINS_BLANK);
}
if (!Pattern.matches(pattern1, nickname)) {
throw new CustomException(NICKNAME_CONTAINS_SPECIAL_CHARACTER);
}
int httpStatusValue = authService.checkNicknameDuplication(nickname);
if (httpStatusValue == HttpStatus.OK.value()) {
return ResponseEntity.status(HttpStatus.OK)
.body(success(NICKNAME_AVAILABLE));
} else {
throw new CustomException(NICKNAME_DUPLICATED);
}
}
AuthService
@Transactional(readOnly = true)
public int checkNicknameDuplication(String nickname) {
User nicknameExistsInDb = userRepository.findUserByNickname(nickname)
.orElse(null);
if (nicknameExistsInDb != null) {
return HttpStatus.CONFLICT.value();
}
return HttpStatus.OK.value();
}
AuthControllerTest
@Test
@DisplayName("닉네임 검증; 공백과 특수문자가 없는경우 정상적인 동작이 수행된다.")
public void nicknameIsAvailable() throws Exception {
String nickname = "test33AA가나마";
mvc.perform(get("/api/auth/check-nickname")
.queryParam("nickname", nickname))
.andExpect(jsonPath("$.message", is("사용 가능한 닉네임입니다")))
.andDo(print());
verify(authService).checkNicknameDuplication(nickname);
}
Postman 테스트 결과
- Postman에서는 정상적으로 잘 동작하였는데, 테스트 코드에서 왜 오류가 나는지??
2. 해결
- AuthController에서, httpStatusValue 값을 System.out.println() 으로 출력하도록 한 뒤, AuthControllerTest에서 실행한 결과, 값이 200이 아닌 0으로 나와서, else {} 구문이 실행되는 것을 확인하였다.
- 링크 1을 참고하면, @MockBean은 가짜 객체이기 때문에, authService 관련 메서드가 실행이 안돼서, when ~ thenReturn으로 가짜 객체에게 원하는 동작을 수행하도록 먼저 해야 한다.
- 아래처럼 Mockto.when 구문을 먼저 실행한 뒤, 테스트를 실행하니 테스트가 성공한다.
@Test
@DisplayName("닉네임 검증; 공백과 특수문자가 없는경우 정상적인 동작이 수행된다.")
public void nicknameIsAvailable() throws Exception {
String nickname = "test33AA가나마";
Mockito.when(authService.checkNicknameDuplication(nickname)).thenReturn(200);
mvc.perform(get("/api/auth/check-nickname")
.queryParam("nickname", nickname))
.andExpect(status().isOk())
.andExpect(jsonPath("$.message", is("사용 가능한 닉네임입니다")))
.andDo(print());
verify(authService).checkNicknameDuplication(nickname);
}
참고 링크
1. Junit5(jupiter) Controller 테스트코드 작성법 (WebMvcTest, MockMvc, MockBean을 사용한 테스트) https://frozenpond.tistory.com/82
2. 참고링크2
3. 참고링크3
4. 참고링크4
반응형
'Spring Boot > Test Code' 카테고리의 다른 글
Junit5] MockMvc equals() and hashcode() (0) | 2023.07.23 |
---|---|
Junit5] MongoDB 테스트 환경 세팅 (0) | 2023.07.17 |
Junit5] 테스트 코드 작성을 위한 서비스 코드 리팩토링 (0) | 2023.07.14 |
Junit5] org.springframework.test.context.event.ApplicationEventsTestExecutionListener.recordApplicationEvents' -> false (0) | 2023.07.08 |
Junit5] NullPointerException with @Value (0) | 2023.07.02 |