Service ํ ์คํธ ์ฝ๋ ์์ฑ ์ ๋จ์ํ ์๋น์ค ๋ก์ง์ด ๋์๊ฐ๋์ง ํ์ธํ๊ธฐ ์ํด์๋, ๋ชจ๋ ๊ณ์ธต๊ณผ ๊ด๊ณ๋ฅผ ๋๊ณ , ์ค๋ก์ง ๋ก์ง๋ง ํ ์คํธ ํ ์ ์๋๋ก ํ๊ฒฝ์ ๊ตฌ์ฑํ๋ ๊ฒ์ด ์ข๋ค.
๊ทธ๋ ๊ธฐ์, mock ๊ฐ์ฒด๋ฅผ ์์ฑํ๊ณ , stubbing ๊ณผ์ ์ ํตํด ๊ฒ์ฆํ๋ ๊ฒ์ด ์ข๋ค.
๊ทธ๋ฐ๋ฐ, ์ ์ฐพ์๋ณด๋ฉด when().thenReturn()
์ ์ฌ์ฉํ๊ธฐ๋ ํ๊ณ , given().willReturn()
์ ์ฌ์ฉํ๊ธฐ๋ ํ๋ค.
๋ ๊ฐ์ ์ฐจ์ด๋ฅผ ์์๋ณด์.
1. Mock
Mock์ด๋ ๋ชจ๋์ ๊ฒ๋ชจ์์ด ์ค์ ๋ชจ๋๊ณผ ๋น์ทํ๋๋ก ๋ง๋ ๊ฐ์ง ๊ฐ์ฒด์ด๋ค.
์์ ์์ ํ๋๋ก, Service ๊ณ์ธต์์ ์์กด์ฑ์ ์ ๊ฑฐํ ์ํ๋ก ํ ์คํธ ์์ฑ์ด ์ด๋ ค์ ์์กด์ฑ์ ๋จ์ ์ํค๋๋ฐ ๋์์ ์ฃผ๋ ๊ฐ์ฒด๋ผ๊ณ ์๊ฐํ๋ฉด ๋๋ค.
2. Mockito
Mock ๊ฐ์ฒด๋ฅผ ์ง์ ๋ง๋ค๊ณ ๊ด๋ฆฌํ๋ ๋ํ์ ์ธ Framework ์ค์ ํ๋๊ฐ ๋ฐ๋ก Mockito์ด๋ค.
Mockito๋ฅผ ์ฌ์ฉํ๊ธฐ ์ํด์๋ @ExtendWith(MockitoExtention.class)
๋ฅผ ํ
์คํธ ํด๋์ค ์๋จ์ ์ง์ ํด์ฃผ๋ฉด ๋๋ค.
๊ทธ๋ฌ๋ฉด @Mock
์ด๋
ธํ
์ด์
์ ํตํด ๊ฐ๋จํ๊ฒ Mock ๊ฐ์ฒด๋ฅผ ๋ง๋ค์ด ์ฌ์ฉํ ์ ์๋ค.
๋ค์๊ณผ ๊ฐ์ ์์๋ฅผ ๋ณด์.
@ExtendWith(MockitoExtension.class)
class PostServiceTest {
@Mock
private PostRepository postRepository;
@InjectMocks
private PostService postService;
private Post post;
@BeforeEach
void setup() {
post = Post.builder().id(1).title("title").body("body").user(user).build();
}
@Test
@DisplayName("ํฌ์คํธ ์์ธ ์กฐํ ์ฑ๊ณต")
void findPost_success() throws Exception {
when(postRepository.findById(post.getId())).thenReturn(Optional.of(post));
PostDetailResponse postDetail = postService.findPost(1);
assertThat(postDetail.getId()).isEqualTo(1);
assertThat(postDetail.getTitle()).isEqualTo("title");
assertThat(postDetail.getBody()).isEqualTo("body");
assertThat(postDetail.getUserName()).isEqualTo("user");
verify(postRepository, times(1)).findById(post.getId());
}
}
์ ์์๋ ํฌ์คํธ ์์ธ ์กฐํ ์ฑ๊ณต ํ ์คํธ ์ํฉ์ด๋ค.
@Mock
์ด๋
ธํ
์ด์
์ ํตํด mock PostRepository ๊ฐ์ฒด๋ฅผ ์์ฑํ๊ณ ,
@InjectMocks
์ด๋
ธํ
์ด์
์ ํตํด @Mock
์ด ๋ถ์ ๋ชฉ๊ฐ์ฒด๋ฅผ @InjectMocks
์ด ๋ถ์ ๊ฐ์ฒด์ ์ฃผ์
ํ๋ค.
๊ทธ๋ฆฌ๊ณ , when
๋ฉ์๋๋ฅผ ํตํด ์ํ๋ ๋์์ ์ ํ ์ ์๋ค.
์ฆ, ์ด๋ค ์ํฉ์์ Mock ๊ฐ์ฒด๊ฐ ์ด๋ค ๊ฐ์ ๋ฆฌํดํ๋๋ก ๋ง๋ค ์ ์๋ค๋ ๋ง์ด๋ค.
์ด๊ฒ์ Stubbing ์ด๋ผ๊ณ ํ๋ค.
assertThat
์ ํตํด ์ค์ ๊ฐ๊ณผ ์์ธก๊ฐ์ ๊ฒ์ฆํ๊ณ ,
๋ง์ง๋ง์ผ๋ก verify
๋ฉ์๋๋ฅผ ํตํด mock ๊ฐ์ฒด์ ๋ด๊ฐ ๋์์ ์ง์ ํ ๋ฉ์๋๊ฐ ์ฌ์ฉ๋๋์ง ํ์ธ ํ ์ ์๋ค.
์ด์ BDDMockito์ ๋ํด ์์๋ณด์.
3. BDDMockito
BDD ๋ Behavior-Driven Development์ ์ฝ์ด๋ก, ๋ฌด์์ ํ ์คํธํ ๊ฒ์ธ๊ฐ ์ ์ด์ ์ด ๋ง์ถฐ์ ธ ์๋ค.
ํ
์คํธ ๋์์ ์ํ ๋ณํ๋ฅผ ์ต์ฐ์ ์ผ๋ก ํ๊ธฐ์ Given(์กฐ๊ฑด), When(๊ธฐ๋ฅ ์ํ), Then(์์ ๊ฒฐ๊ณผ)
์ ์๋๋ฆฌ์ค ํจํด์ผ๋ก ์ด๋ฃจ์ด์ ธ ์๋ค.
๊ทธ๋ ๋ค๋ฉด, ์์ ์ฝ๋์์ ์ด์ํ ๋ถ๋ถ์ ๋ฐ๋ก ์ฐพ์ ์ ์๋ค.
๋ฐ๋ก, Stubbing
ํ๋ ๋ถ๋ถ์ด ๋ฌธ์ ๊ฐ ๋๋ค.
when(postRepository.findById(post.getId())).thenReturn(Optional.of(post));
ํ
์คํธ ์ฝ๋ ํ๋ฆ ์, when().thenReturn()
๋ถ๋ถ์ ํ
์คํธ ์์ ์ง์ ์ธ ์กฐ๊ฑด์ ๊ฑฐ๋ ์ํฉ์ด๋ค.
์๋๋ฆฌ์ค ํจํด ์ Given
์ง์ ์ด๋ค.
๊ทธ๋ฐ๋ฐ, when
์ผ๋ก ์์ํ๋ ๋ถ๋ช
ํ ์ด์ํ๋ค.
์ด๋ฐ ๋ถ๋ถ์ ํด๊ฒฐํ๊ธฐ ์ํด, ์๋๋ฆฌ์ค์ ๋ง๊ฒ๋ ํ ์คํธ ์ฝ๋ ํ๋ฆ์ด ์ด์ด์ง ์ ์๊ฒ ์ด๋ฆ์ ๋ณ๊ฒฝํด์ค ํ๋ ์์ํฌ๊ฐ ๋ฐ๋ก BDDMockito๋ผ๊ณ ์๊ฐํ๋ฉด ๋๋ค.
์ฌ์ค BDDMockito ์ฝ๋๋ฅผ ์ดํด๋ณด๋ฉด ๋ณ๋์ ํ๋ ์์ํฌ๊ฐ ์๋๋ผ Mockito๋ฅผ ์์ํ ํด๋์ค์ด๋ค.
์ธ๋ถ ๋์์๋ ์ฐจ์ด๊ฐ ์๊ณ , ํ ์คํธ ์ฝ๋์ ๊ฐ๋ ์ฑ์ ๋์ด๊ธฐ ์ํ ํ๋ ์์ํฌ๋ผ๊ณ ๋ณด๋ฉด ๋๋ค.
์์ ์ ์ฒด ์ฝ๋๋ฅผ ๋ณ๊ฒฝํด๋ณด๋ฉด, ๋ค์๊ณผ ๊ฐ๋ค.
@ExtendWith(MockitoExtension.class)
class PostServiceTest {
@Mock
private PostRepository postRepository;
@InjectMocks
private PostService postService;
private Post post;
@BeforeEach
void setup() {
post = Post.builder().id(1).title("title").body("body").user(user).build();
}
@Test
@DisplayName("ํฌ์คํธ ์์ธ ์กฐํ ์ฑ๊ณต")
void findPost_success() throws Exception {
given(postRepository.findById(post.getId())).willReturn(Optional.of(post));
PostDetailResponse postDetail = postService.findPost(1);
assertThat(postDetail.getId()).isEqualTo(1);
assertThat(postDetail.getTitle()).isEqualTo("title");
assertThat(postDetail.getBody()).isEqualTo("body");
assertThat(postDetail.getUserName()).isEqualTo("user");
verify(postRepository, times(1)).findById(post.getId());
}
}
Leave a comment