좋아요 기능을 테스트하는 테스트코드를 작성하였다.
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());
}
참고자료
'프로젝트 > SNS만들기' 카테고리의 다른 글
[SNS Project] 마이피드 기능 구현 (0) | 2023.01.06 |
---|---|
[SNS Project] 좋아요 기능 - Soft Delete 리펙토링(@Modifying) (2) | 2023.01.06 |
[SNS Project] Post, User 예외처리 분리하기 (0) | 2023.01.04 |
[SNS Project] 좋아요 조회 (0) | 2023.01.04 |
[SNS Project] 좋아요 기능 (0) | 2023.01.04 |