Mocking Framework - Mockito
Mockito๋ Java ๋จ์ ํ ์คํธ(Unit Test) ์์ฑ์ ๋๋ ๋ชจํน(Mocking) ํ๋ ์์ํฌ๋ก, ์ค์ ์์กด ๊ฐ์ฒด ๋์ ๊ฐ์ง ๊ฐ์ฒด(Mock Object)๋ฅผ ์์ฑํ๊ณ ์ ์ดํ๋ ๊ธฐ๋ฅ์ ์ ๊ณตํ๋ค.
ํ ์คํธ ํ๊ฒฝ ๊ฒฉ๋ฆฌ: ์ธ๋ถ ์์ธ(DB, ๋คํธ์ํฌ, ๋ค๋ฅธ ํด๋์ค์ ๋ด๋ถ ๋ก์ง ๋ฑ)์ ์ํฅ์ ๋ฐ์ง ์๊ณ ํ ์คํธ ๋์์ ๋ก์ง์๋ง ์ง์คํ ์ ์๋๋ก ์ง์
ํ๋ ์ ์ด ๋ฐ ๊ฒ์ฆ: ์ํ๋ ๋ชจ๋ ์ํฉ์ ์๋ฎฌ๋ ์ด์ (Stubbing)ํ๊ณ , ๋ฉ์๋๊ฐ ์์๋๋ก ํธ์ถ๋์๋์ง(Verification) ๊ฒ์ฆํ๋ ๊ฐ๋ ฅํ ๊ธฐ๋ฅ์ ์ ๊ณต
๊ฐ๋ ์ฑ ๋์ ํ ์คํธ: BDD(Behavior-Driven Development) ์คํ์ผ์ ์ง์ํ๋ ๋ฑ, ํ ์คํธ ์ฝ๋์ ์๋๋ฅผ ๋ช ํํ๊ฒ ํํํ ์ ์๋๋ก ์ง์
1. Mock ๊ฐ์ฒด ์์ฑ
์์กด์ฑ์ ๋์ฒดํ ๊ฐ์ง ๊ฐ์ฒด๋ฅผ ๋ง๋๋ ๋ฐฉ๋ฒ์ ํฌ๊ฒ ๋ ๊ฐ์ง๋ค.
Mockito.mock() ๋ฉ์๋ ์ฌ์ฉ
Mockito.mock() ๋ฉ์๋ ์ฌ์ฉ๊ฐ์ฅ ๊ธฐ๋ณธ์ ์ธ ๋ฐฉ๋ฒ์ผ๋ก, mock() ์ ์ ๋ฉ์๋๋ฅผ ์ฌ์ฉํด Mock ๊ฐ์ฒด๋ฅผ ์ง์ ์์ฑํ๋ค.
import static org.mockito.Mockito.mock;
class MemberServiceTest {
MemberRepository mockMemberRepository = mock(MemberRepository.class);
}@Mock ์ด๋
ธํ
์ด์
์ฌ์ฉ
@Mock ์ด๋
ธํ
์ด์
์ฌ์ฉJUnit 5 ํ์ฅ ๊ธฐ๋ฅ์ ์ฌ์ฉํ์ฌ ์ ๋ ธํ ์ด์ ๊ธฐ๋ฐ์ผ๋ก Mock ๊ฐ์ฒด๋ฅผ ์์ฑํ๊ณ ์ฃผ์ ํ๋ค.
@ExtendWith(MockitoExtension.class): ํ ์คํธ ํด๋์ค์ Mockito ํ์ฅ ๊ธฐ๋ฅ ํ์ฑํ@Mock: ํด๋น ํ๋๋ฅผ Mock ๊ฐ์ฒด๋ก ์ด๊ธฐํ@InjectMocks: ํ ์คํธ ๋์ ๊ฐ์ฒด๋ฅผ ์์ฑํ๊ณ ,@Mock๋๋@Spy๋ก ์์ฑ๋ ์์กด ๊ฐ์ฒด๋ฅผ ์๋์ผ๋ก ์ฃผ์
@Spy - ์ค์ ๊ฐ์ฒด ์ผ๋ถ Mocking
@Spy - ์ค์ ๊ฐ์ฒด ์ผ๋ถ Mocking์ค์ ๊ฐ์ฒด๋ฅผ ์ฌ์ฉํ๋ฉด์ ํน์ ๋ฉ์๋์ ํ๋๋ง ๋ณ๊ฒฝํ๊ณ ์ถ์ ๋ ์ฌ์ฉํ๋ค.
@MockBean - ์คํ๋ง ์ปจํ
์คํธ ํตํฉ ํ
์คํธ์ฉ
@MockBean - ์คํ๋ง ์ปจํ
์คํธ ํตํฉ ํ
์คํธ์ฉ@Mock์ด ์์ ๋จ์ ํ
์คํธ์ฉ์ด๋ผ๋ฉด, @MockBean์ ์คํ๋ง ์ปจํ
์คํธ์ ํตํฉ๋ ํ
์คํธ์์ ์ฌ์ฉ๋๋ค.
๋์ ๋ฐฉ์: ์คํ๋ง์
ApplicationContext์ ๋ฑ๋ก๋ ์ค์ ๋น(Bean)์ Mockito Mock ๊ฐ์ฒด๋ก ๊ต์ฒด์ฃผ์ ์ฌ์ฉ์ฒ
@WebMvcTest: ์ปจํธ๋กค๋ฌ ํ ์คํธ ์, ํ์ ๊ณ์ธต์ธService๋ฅผ Mock ๊ฐ์ฒด๋ก ๋์ฒดํ ๋ ์ฌ์ฉ@SpringBootTest: ํตํฉ ํ ์คํธ ์ค, ์ธ๋ถ API ํธ์ถ (ApiClient) ๋ฑ ํน์ ๋น๋ง ๊ฐ์ง๋ก ๋์ฒดํ ๋ ์ฌ์ฉ
@MockBean์ด๋ @SpyBean์ ์ฌ์ฉํ๋ฉด, ๊ธฐ์กด๊ณผ ๋ค๋ฅธ ์ค์ ์ ์ปจํ
์คํธ๊ฐ ํ์ํ๋ค๊ณ ๊ฐ์ฃผ๋์ด ์ปจํ
์คํธ ์บ์๊ฐ ์ฌ์ฌ์ฉ๋์ง ์๋๋ค.
2. Stubbing - ํ๋ ์ ์
Mock ๊ฐ์ฒด๊ฐ ํน์ ๋ฉ์๋ ํธ์ถ์ ์ด๋ป๊ฒ ์๋ตํ ์ง ๋ฏธ๋ฆฌ ์ ์ํ๋ ๊ณผ์ ์ด๋ค.
when() ๊ณ์ด
when() ๊ณ์ด๋ฐํ๊ฐ์ด ์๋ ๋ฉ์๋์ ํ๋์ ์ ์ํ ๋ ์ฌ์ฉํ๋ค.
thenReturn(value): ๊ณ ์ ๋ ๊ฐ์ ๋ฐํthenThrow(exception): ์์ธ ๋ฐ์thenAnswer(answer): ๋์ ์ธ ๋ก์ง์ ํตํด ๊ณ์ฐ๋ ๊ฐ์ ๋ฐํ
do*() ๊ณ์ด
do*() ๊ณ์ด๋ฐํ๊ฐ์ด void์ธ ๋ฉ์๋๋, ์ค์ ๋ฉ์๋ ํธ์ถ์ ํผํ๋ฉด์ Stubbing ํด์ผ ํ๋ Spy ๊ฐ์ฒด์ ์ฌ์ฉ๋๋ค.
doNothing(): ์๋ฌด ๋์๋ ํ์ง ์์doThrow(exception): ์์ธ ๋ฐ์doAnswer(answer): ๋์ ์ธ ๋ก์ง์ ์คํdoReturn(value):when()๋์ ์ฌ์ฉํ๋ Stubbing(Spy ๊ฐ์ฒด์ ๊ถ์ฅ)
BDD ์คํ์ผ Stubbing (given/willReturn)
given/willReturn)BDD(ํ์ ์ฃผ๋ ๊ฐ๋ฐ) ์คํ์ผ์ ์ ํธํ๋ ๊ฒฝ์ฐ, BDDMockito๋ฅผ ์ฌ์ฉํ ์ ์๋ค.
given(mock.method()):when(mock.method())๋์ผwillReturn(value):thenReturn(value)๋์ผ
3. Verification - ํ์ ๊ฒ์ฆ
ํ ์คํธ ๋์ ๋ก์ง์ด ์คํ๋ ํ, Mock ๊ฐ์ฒด์ ๋ฉ์๋๊ฐ ์์๋๋ก ํธ์ถ๋์๋์ง ๊ฒ์ฆํ๋ค.
times(n): ์ ํํn๋ฒ ํธ์ถ๋์๋์ง ๊ฒ์ฆverify(mock): ํด๋น ๋ฉ์๋๊ฐ 1๋ฒ ํธ์ถ๋์๋์ง ๊ฒ์ฆ(=times(1))never(): ํ ๋ฒ๋ ํธ์ถ๋์ง ์์๋์ง ๊ฒ์ฆ(=times(0))atLeast(n)/atMost(n): ์ต์n๋ฒ / ์ต๋n๋ฒ ํธ์ถ๋์๋์ง ๊ฒ์ฆinOrder(mock...): ์ฌ๋ฌ Mock ๊ฐ์ฒด์ ๊ฑธ์ณ ํธ์ถ ์์๊ฐ ์ ํํ์ง ๊ฒ์ฆtimeout(millis): ๋น๋๊ธฐ ์ฝ๋ ํ ์คํธ ์, ์ง์ ๋ ์๊ฐ ๋ด์ ๋ฉ์๋๊ฐ ํธ์ถ๋๋์ง ๊ฒ์ฆ
BDD ์คํ์ผ ๊ฒ์ฆ (then/should)
then/should)BDDMockito๋ ๊ฒ์ฆ์ ์ํ then/should ๋ฌธ๋ฒ๋ ์ ๊ณตํ๋ค.
4. Argument Matchers & Captors
Argument Matchers
Stubbing์ด๋ ๊ฒ์ฆ ์, ์ธ์์ ์ค์ ๊ฐ ๋์ ์ ์ฐํ ์กฐ๊ฑด์ ์ฌ์ฉํ๊ณ ์ถ์ ๋ ํ์ฉํ๋ค.
any(): ๋ชจ๋ ํ์ ์ ๊ฐ์ฒด๋ฅผ ํ์ฉ(anyString(),anyInt()๋ฑ ํ์ ๋ณ Matcher ์ ๊ณต)eq(value): ํน์ ๊ฐ๊ณผ ๋์ผํด์ผ ํจ์ ๋ช ์argThat(matcher): ์ปค์คํ Matcher๋ฅผ ์ฌ์ฉํ์ฌ ๋ณต์กํ ์กฐ๊ฑด ์ง์ ๊ฐ๋ฅ
์ค์ํ ์ ์ ๋ฉ์๋์ ์ฌ๋ฌ ์ธ์ ์ค ํ๋๋ผ๋ Argument Matcher๋ฅผ ์ฌ์ฉํ๋ค๋ฉด, ๋ชจ๋ ์ธ์๋ฅผ Matcher๋ก ์์ฑํด์ผ ํ๋ค.
ArgumentCaptor(์ธ์ ์บก์ฒ)
Mock ๊ฐ์ฒด์ ๋ฉ์๋๊ฐ ํธ์ถ๋ ๋ ์ ๋ฌ๋ ์ค์ ์ธ์ ๊ฐ์ ํฌ์ฐฉ(Capture)ํ์ฌ, ๋์ค์ ๊ฒ์ฆํ ์ ์๋๋ก ๋๋๋ค.
๋ฉ์๋ ํธ์ถ ์ฌ๋ถ๋ฟ๋ง ์๋๋ผ, "์ ํํ ์ด๋ค ๊ฐ์ด ์ ๋ฌ๋์๋์ง" ๊ทธ ๋ด์ฉ์ ๊ฒ์ฆํด์ผ ํ ๋ ์ฌ์ฉํ๋ค. (์: save ๋ฉ์๋๋ก ์ ๋ฌ๋ ๊ฐ์ฒด์ ํ๋ ๊ฐ ๊ฒ์ฆ)
Last updated
Was this helpful?