Mockito์ BDDMockito๋ฅผ ์ด์ฉํด ํ ์คํ ํ๋ ๋ฐฉ๋ฒ์ ๊ฐ์ฅ ํฐ ์ฐจ์ด์ ์ BDDMockito๋ฅผ ์ด์ฉํ๋ฉด,
์ํ ๋ณํ์ ์ด์ ์ ๋ง์ถ๋ ํ๋ฆ์ ์กฐ๊ธ ๋ ๊ฐ๊น๊ฒ ํ ์คํธ ์ฝ๋๋ฅผ ์์ฑํ ์ ์๋ค๋ ๊ฒ์ด์๋ค.
Mockito๋ฅผ ์ด์ฉํ๋ฉด, when().thenReturn()
์, BDDMockito๋ฅผ ์ด์ฉํ๋ฉด given().willReturn()
์ ์ฌ์ฉํ๋ค.
๊ธฐ๋ณธ์ ์ผ๋ก Mockito๋ BDDMocktio๋ when()
ํน์ given()
์ ํตํด ๋์์ ์ง์ ํ๋ค.
ํ์ง๋ง, void()๋ฅผ ๋ฆฌํด ํ์์ผ๋ก ๊ฐ๋ ๋ฉ์๋๋ stubbingํ๋ ๋ฒ์ด ์ฝ๊ฐ ๋ค๋ฅด๋ค.
์์์ ์ค๋ช
ํ ์ผ๋ฐ stubbing์ when(mock.method()).thenReturn(value)
ํ์์ธ๋ฐ, mock.method()
๊ฐ void๊ฐ์ ๊ฐ์ง๋ฉด when(void)
์ฒ๋ผ ๋๊ธฐ ๋๋ฌธ์ Java ๋ฌธ๋ฒ์ ๋ง์ง ์๋๋ค.
๋์ doNothing().when(mock).method()
์ฒ๋ผ ์ฌ์ฉํ๋ค.
Mockito์ BDDMockito ๊ฐ๊ฐ์ ์ด์ฉํด์ void ๋ฉ์๋๋ฅผ ํ ์คํ ํ๋ ๋ฐฉ๋ฒ์ ์ข ๋ ์์ธํ ์ดํด๋ณด๊ฒ ๋ค.
1. Mockito ์ฌ์ฉ ์
postService
์ update
๋ฉ์๋๋ ๋ค์๊ณผ ๊ฐ์ด ํ๋ผ๋ฏธํฐ ๋ณ์๋ก ์ธ๊ฐ์ง ๊ฐ์ ๊ฐ์ง๋ฉฐ ๋ฆฌํด ํ์
์ด void์ด๋ค.
public void update(Integer id, String userName, PostUpdateRequest request) {
Post post = validatePost(id, userName);
post.updatePost(request.getTitle(),request.getBody());
}
update
๋ฉ์๋๋ ํฌ์คํธ๋ฅผ ์์ ํ๋ ๋ฉ์๋์ด๋ฉฐ ์ฑ๊ณต ํ
์คํธ๋ ๋ค์๊ณผ ๊ฐ๋ค.
ํ๊ฐ์ง ๋ฌ๋ผ์ง ์ ์ doNothing()
์ ์ฌ์ฉํ๋ค๋ ์ ์ด๋ค.
์ฑ๊ณต ํ
์คํธ์ void ํ์
์ ๊ฒฝ์ฐ ๋ฐํ๊ฐ์ด ์๊ธฐ ๋๋ฌธ์ doNothing()
์ผ๋ก ๋์์ ๊ฒฐ๊ณผ๋ฅผ ์ง์ ํ๊ณ , ๊ทธ ๋ค์ ๋์์ ์กฐ๊ฑด์ ์ค์ ํ๋ค.
@Test
@DisplayName("ํฌ์คํธ ์์ ์ฑ๊ณต")
@WithMockCustomUser
public void post_update_success() throws Exception {
doNothing().when(postService).update(any(),any(),any());
mockMvc.perform(put("/api/v1/posts/1")
.with(csrf())
.contentType(MediaType.APPLICATION_JSON)
.content(objectMapper.writeValueAsBytes(postUpdateRequest)))
.andExpect(status().isOk())
.andExpect(jsonPath("$.resultCode").value("SUCCESS"))
.andExpect(jsonPath("$.result.postId").value(1))
.andExpect(jsonPath("$.result.message").value("ํฌ์คํธ ์์ ์๋ฃ"))
.andDo(print());
verify(postService, times(1)).update(any(), any(), any());
}
์ด๋ฒ์ void ํ์ ์ ์คํจ ํ ์คํธ๋ฅผ ์งํํด๋ณด๊ฒ ๋ค.
๊ธฐ์กด์ when().willThrow()
๊ฐ ์๋๋ผ doThrow()
๋ก ์์ํ ๋ค, ๋์์ ์กฐ๊ฑด์ ์ค์ ํ๋ค.
@Test
@DisplayName("ํฌ์คํธ ์์ ์คํจ(2) : ํฌ์คํธ ๋ด์ฉ ์์")
@WithMockCustomUser
public void post_update_fail2() throws Exception {
doThrow(new AppException(ErrorCode.POST_NOT_FOUND)).when(postService).update(any(),any(), any());
mockMvc.perform(put("/api/v1/posts/1")
.with(csrf())
.contentType(MediaType.APPLICATION_JSON)
.content(objectMapper.writeValueAsBytes(postUpdateRequest)))
.andExpect(status().is(ErrorCode.POST_NOT_FOUND.getStatus().value()))
.andExpect(status().isNotFound())
.andExpect(jsonPath("$.resultCode").value("ERROR"))
.andExpect(jsonPath("$.result.errorCode").value("POST_NOT_FOUND"))
.andExpect(jsonPath("$.result.message").value("ํด๋น ํฌ์คํธ๊ฐ ์์ต๋๋ค."))
.andDo(print());
verify(postService, times(1)).update(any(), any(), any());
}
2. BDDMockito ์ฌ์ฉ ์
BDDMockito์ ๊ฒฝ์ฐ์๋ ํฌ๊ฒ ๋ค๋ฅด์ง ์๋ค.
๋ง์ฐฌ๊ฐ์ง๋ก ํฌ์คํธ ์์ ์ฑ๊ณต ํ
์คํธ์์ willDoNothing()
์ ํตํด ๊ฒฐ๊ณผ๋ฅผ ๋จผ์ ์ง์ ํ๊ณ ์์ํ๋ค.
@Test
@DisplayName("ํฌ์คํธ ์์ ์ฑ๊ณต")
@WithMockCustomUser
public void post_update_success() throws Exception {
willDoNothing().given(postService).update(any(),any(),any());
mockMvc.perform(put("/api/v1/posts/1")
.with(csrf())
.contentType(MediaType.APPLICATION_JSON)
.content(objectMapper.writeValueAsBytes(postUpdateRequest)))
.andExpect(status().isOk())
.andExpect(jsonPath("$.resultCode").value("SUCCESS"))
.andExpect(jsonPath("$.result.postId").value(1))
.andExpect(jsonPath("$.result.message").value("ํฌ์คํธ ์์ ์๋ฃ"))
.andDo(print());
then(postService).should(times(1)).update(any(), any(), any());
}
์คํจ ํ
์คํธ๋ Mockito๊ฐ ์ฌ์ฉํ doThrow
๊ฐ ์๋ willThrow()
๋ฅผ ์ฌ์ฉํ๋ค.
@Test
@DisplayName("ํฌ์คํธ ์์ ์คํจ(2) : ํฌ์คํธ ๋ด์ฉ ์์")
@WithMockCustomUser
public void post_update_fail2() throws Exception {
willThrow(new AppException(ErrorCode.POST_NOT_FOUND)).given(postService).update(any(),any(), any());
mockMvc.perform(put("/api/v1/posts/1")
.with(csrf())
.contentType(MediaType.APPLICATION_JSON)
.content(objectMapper.writeValueAsBytes(postUpdateRequest)))
.andExpect(status().is(ErrorCode.POST_NOT_FOUND.getStatus().value()))
.andExpect(status().isNotFound())
.andExpect(jsonPath("$.resultCode").value("ERROR"))
.andExpect(jsonPath("$.result.errorCode").value("POST_NOT_FOUND"))
.andExpect(jsonPath("$.result.message").value("ํด๋น ํฌ์คํธ๊ฐ ์์ต๋๋ค."))
.andDo(print());
then(postService).should(times(1)).update(any(), any(), any());
}
์ถ๊ฐ์ ์ผ๋ก, BDDMockito๋ฅผ ์ฌ์ฉํ๋ฉด Mockito์ verify
๋ถ๋ถ๋ ์กฐ๊ธ ๋ค๋ฅด๋ค.
Mockito
verify(postService, times(1)).update(any(), any(), any());
BDDMockito
then(postService).should(times(1)).update(any(), any(), any());
Leave a comment