@GetMapping("/todos/{todoId}")
public ResponseEntity<TodoResponse> getTodo(@PathVariable long todoId) {
return ResponseEntity.ok(todoService.getTodo(todoId));
}
해당 컨트롤러에 대한 테스트코드로 예외문이 정상 작동하는지 확인고 싶어서 테스트 코드를 작성하였다.
@Test
void todo_단건_조회_시_todo가_존재하지_않아_예외가_발생한다() throws Exception {
// given
long todoId = 1L;
// when
when(todoService.getTodo(todoId))
.thenThrow(new InvalidRequestException("Todo not found"));
// then
mockMvc.perform(get("/todos/{todoId}", todoId))
.andExpect(status().isOk())
.andExpect(jsonPath("$.status").value(HttpStatus.OK.name()))
.andExpect(jsonPath("$.code").value(HttpStatus.OK.value()))
.andExpect(jsonPath("$.message").value("Todo not found"));
}
해당 코드를 돌리면
status
expected:200
actual : 400
해당 에러가 자꾸 발생 하였다.
Todo를 찾지 못할 때 예외가 발생하고, 그 예외가 적절하게 HTTP 응답으로 반환되는지를 테스트인데, 내가 잘못 생각 했었다.
내생각으로는 결과에서 정상 작동 되었지만 찾는 Todo가 없어서 그 부분에서만 예외가 나와야한다고 생각을 해서 자꾸 status를 ok 로 내보내려고 했으나 작동은 400 bad request로 나와서 생긴 오류였다.
@Test
@WithMockUser(username = "testUser",roles = "ADMIN")
void todo_단건_조회_시_todo가_존재하지_않아_예외가_발생한다() throws Exception {
// given
long todoId = 1L;
// when
given(todoService.getTodo(todoId))
.willThrow(new InvalidRequestException("Todo not found"));
// then
mockMvc.perform(get("/todos/{todoId}", todoId))
.andExpect(status().isBadRequest())
.andExpect(jsonPath("$.status").value(HttpStatus.BAD_REQUEST.name()))
.andExpect(jsonPath("$.code").value(HttpStatus.BAD_REQUEST.value()))
.andExpect(jsonPath("$.message").value("Todo not found"));
}
해당 코드 then 부분을 bad request를 반환하도록 status, code의 값을 바꿔줘야 실제 로직이 진행되면서 나오는 결과값과 같아져 테스트 통과가 진행된다.
'java 배우기 > TIL' 카테고리의 다른 글
| 팀 프로젝트 기획하고 역할 분담하기 (8) | 2024.10.13 |
|---|---|
| 검색기능 구현 중 에러 표시 (1) | 2024.10.10 |
| 기술 면접 준비하기-2 (0) | 2024.10.10 |
| 기술 면접 준비하기-1 (0) | 2024.10.10 |
| N+1 문제 해결해보기 (0) | 2024.10.03 |