수진개발서

좋아요 기능을 테스트하는 테스트코드를 작성하였다.

Mock라이브러를 사용하였다.

 

요구사항

Controller테스트
- 좋아요 누르기 성공
- 좋아요 누르기 실패: 로그인 하지 않은 경우
- 좋아요 누르기 실패: 해당 Post가 없는 경우

코드

LikeControllerTest

좋아요 기능 테스트를 Mock라이브러리를 사용해서 구현하였다.

Service쪽의 로직테스트가 아닌 Controller테스트이기 때문에 Service는 Mock을 사용해서 가짜객체를 생성해주었다.

 

좋아요 기능은 result에 String값만 반환해주기 때문에 그 반환된 문자열 값이 내가 원하는게 맞는지를 비교해주고 싶었다.

그럴 경우 MockMvc에서 json을 검증하기 위해 다양한 방법들이 있었다.

.andExpect(jsonPath("$.result").value("좋아요를 눌렀습니다."))

에서 josnPath의 value를 사용해서 Controller에서 해당 String이 잘 반환되었는지 확인해주었다.

이외에도 반환된 json을 검증하기 위해서 다양한 함수들이 존재하는 것 같아서 공부해보고 아래에 관련 포스팅을 올려놓겠다.

class LikeControllerTest {

    @Autowired
    MockMvc mockMvc;

    @MockBean
    LikeService likeService;

    @Autowired
    ObjectMapper objectMapper;

    @Test
    @DisplayName("좋아요 누르기 성공")
    @WithMockUser
    void like_success() throws Exception{
        String url = "/posts/1/likes";

        given(likeService.controlLike(any(), any())).willReturn("좋아요를 눌렀습니다.");

        mockMvc.perform(post(url)
                        .with(csrf())
                        .contentType(MediaType.APPLICATION_JSON))
                .andDo(print())
                .andExpect(status().isOk())
                //해당 내용이 있는지 테스트
                .andExpect(jsonPath("$.result").value("좋아요를 눌렀습니다."));

    }

    @Test
    @DisplayName("좋아요 누르기 실패(1) - 로그인 하지 않은 경우")
    @WithAnonymousUser
    void like_fail_not_login() throws Exception{
        String url = "/posts/1/likes";

        given(likeService.controlLike(any(), any())).willThrow(new AppException(ErrorCode.INVALID_PERMISSION, ""));

        mockMvc.perform(post(url)
                        .with(csrf())
                        .contentType(MediaType.APPLICATION_JSON))
                .andDo(print())
                .andExpect(status().isUnauthorized());

    }

    @Test
    @DisplayName("좋아요 누르기 실패(2) - 해당 Post가 없는 경우")
    @WithMockUser
    void like_fail_non_post() throws Exception{
        String url = "/posts/1/likes";

        given(likeService.controlLike(any(), any())).willThrow(new AppException(ErrorCode.POST_NOT_FOUND, ""));

        mockMvc.perform(post(url)
                        .with(csrf())
                        .contentType(MediaType.APPLICATION_JSON))
                .andDo(print())
                .andExpect(status().isNotFound());

    }

 

참고자료

https://ykh6242.tistory.com/entry/MockMvc%EB%A5%BC-%EC%9D%B4%EC%9A%A9%ED%95%9C-REST-API%EC%9D%98-Json-Response-%EA%B2%80%EC%A6%9D

 

MockMvc를 이용한 REST API의 Json Response 검증

MockMvc를 이용하여 API의 Json Response를 JsonPath 표현식을 사용해 검증하는 예제를 정리하였습니다. 테스트 예제를 보기 앞서 테스트에 필요한 기본적인 지식들을 간단히 서술 해보겠습니다. 의존성

ykh6242.tistory.com

 

profile

수진개발서

@sujin_park0607

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!