• 카테고리

    질문 & 답변
  • 세부 분야

    백엔드

  • 해결 여부

    해결됨

컨트롤러단 NotFound 테스트는 어떻게 하나요?

24.01.09 04:44 작성 24.01.09 04:45 수정 조회수 93

0

@DisplayName("요청 게시물 ID에 해당하는 게시물이 반드시 존재해야 한다.")
@Test
void postDetailWithNonExistPostId() throws Exception {
    //given

    //when
    ResultActions result = mvc.perform(get("/api/posts/{id}", 2000));

    //then
    result
            .andExpect(status().isBadRequest())
            .andExpect(jsonPath("$.status").value("fail"))
                .andExpect(jsonPath("$.message").value("해당 게시물을 찾을 수 없습니다."))
            .andDo(print());
    }

MockMvc로 컨트롤러 테스트를 하고 있습니다.

게시물을 조회하는데 id에 해당하는 게시물이 없다면 제가 직접 정의한 EntityNotFoundException이 발생하게 구현했습니다. 이 익셉션이 발생하면 400에러가 발생됩니다.

테스트 할 때 id 값을 엉뚱하게 2000으로 주는데 아래와 같이 200OK 가 뜨면서 null 값으로 가져오더라고요. 가져온 게시물은 null 값이면서 왜 id 2000의 게시물이 존재한다고 판단하고 정상적으로 동작하는걸까요?

위와 같은 NotFound 예외처리 테스트할 땐 어떤식으로 해야될까요?

 

 

답변 1

답변을 작성해보세요.

1

y2gcoder님의 프로필

y2gcoder

2024.01.09

안녕하세요. gelab님, 공식 서포터즈 y2gcoder입니다.

테스트 작성 스타일은 모두 다르고, 저 또한 테스트 코드를 잘 짜는 사람은 아니기 때문에 참고만 해주십쇼!
말씀해주신 사항을 들어봤을 때, 본질적으로는 이 테스트 케이스는 통합 테스트 내지는 서비스 단위 테스트로 이관해야할 것 같다고 생각했습니다.

왜냐하면 비즈니스 로직을 통해 해당 id를 가진 post가 존재하지 않는다는 것을 체크해야 하기 때문입니다. 이는 서비스단에서 담당하는 역할이라고 생각하기 때문입니다. 그래서 해당 id를 가진 post가 존재하는지를 체크하는 것이 해당 테스트 케이스의 본질이라고 생각하고 서비스 단위 테스트 코드를 짜는 것이 맞다고 생각합니다. 아니면 @SpringBootTest를 이용해서 서비스, 리포지토리까지 모두 사용하는 테스트 코드를 짜는 것이 맞다고생각합니다.

감사합니다.