java 배우기/TIL

컨트롤러 테스트코드 수정하기

checkuu 2024. 10. 10. 21:21
@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