๐ Mockito ๋?
Mockito ๋ Junit5๋ฅผ ์ด์ฉํ ๋จ์ํ ์คํธ ์ฝ๋๋ฅผ ์์ฑํ ๋ Mock์ ์ํด ๋ง์ด ์ฌ์ฉํ๋ Framewor์ ๋๋ค.
ํ ์คํธ ๋์ญ(Test Double)์ ์ข ๋ฅ ์ค ๋ชจ์(Mock) ๊ฐ์ฒด๋ฅผ ํ์๋ก ํ ๋ ์ฌ์ฉํฉ๋๋ค.
โ๏ธ ํ ์คํธ ๋์ญ(Test Double)
ํ ์คํธ๋ฅผ ์ํด ์ค์ ๊ฐ์ฒด๋ฅผ ๋์ฒดํ๋ ๊ฒ์ ๋งํฉ๋๋ค.
โ๏ธ ๋ชจ์(Mock) ๊ฐ์ฒด
ํธ์ถํ์ ๋ ์ฌ์ ์ ์ ์๋ ๋ช ์ธ๋๋ก์ ๊ฒฐ๊ณผ๋ฅผ ๋๋ ค์ฃผ๋๋ก ๋ฏธ๋ฆฌ ํ๋ก๊ทธ๋จ๋์ด ์๋ ํ ์คํธ์ฉ ๊ฐ์ฒด.
Mockito ๊ธฐ๋ณธ ์ฌ์ฉ
//์์กด์ฑ ์ ์ธ
testImplementation 'org.mockito:mockito-core:3.11.2'
testImplementation 'org.mockito:mockito-junit-jupiter:3.11.2'
testRuntimeOnly 'org.junit.jupiter:junit-jupiter-engine:5.7.0'
//ํ
์คํธ ์ฝ๋์์ ์ด๋
ธํ
์ด์
์ผ๋ก ์ ์ธ
@ExtendWith(MockitoExtension.class)
class UserServiceTest {
}
Mock์ด๋?
๊ฐ์ฒด๊ฐ ์์กด์ฑ์ด ์๋ ๊ฐ์ฒด๋ฅผ ๋์ ํ๋ ๊ฐ์ง ๊ฐ์ฒด์
๋๋ค.
๊ฐ๋ฐํ ํ๋ก๊ทธ๋จ์ ํ
์คํธ ํ ๊ฒฝ์ฐ ํ
์คํธ๋ฅผ ์ํํ ๋ชจ๋๊ณผ ์ฐ๊ฒฐ๋๋ ์ธ๋ถ์ ๋ค๋ฅธ ์๋น์ค๋ ๋ชจ๋๋ค์ ์ค์ ์ฌ์ฉํ๋ ๋ชจ๋์ ์ฌ์ฉํ์ง ์๊ณ ์ค์ ์ ๋ชจ๋์ ํ๋ด๋ด๋ ๊ฐ์ง ๋ชจ๋์ ์์ฑํ์ฌ ํ
์คํธ์ ํจ์ฉ์ฑ์ ๋์ด๋๋ฐ ์ฌ์ฉํ๋ ๊ฐ์ฒด์
๋๋ค.
Mock ๊ฐ์ฒด ์ฌ์ฉ ํ๋ ์ํฉ
- ํ ์คํธ ์์ฑ์ ์ํ ํ๊ฒฝ ๊ตฌ์ถ์ด ์ด๋ ค์ด ๊ฒฝ์ฐ
- ํ ์คํธ๊ฐ ํน์ ๊ฒฝ์ฐ๋ ์๊ฐ์ ์์กด์ ์ธ ๊ฒฝ์ฐ
@Mock vs @InjectMocks
@Mock ์ด๋ ธํ ์ด์ ์ ์ฌ์ฉํ์ฌ Mock ๊ฐ์ฒด๋ฅผ ์์ฑํฉ๋๋ค.
@InjectMocks๋ผ๋ ์ด๋ ธํ ์ด์ ์ @Mock์ด ๋ถ์ Mock๊ฐ์ฒด๋ฅผ @InjectMocks๊ฐ ๋ถ์ ๊ฐ์ฒด์ ์ฃผ์ ํ ์ ์์ต๋๋ค.
@Mock
private CouponHelper couponHelper;
@InjectMocks
private CouponInfoConfirmQueryService service;
JUnit ์ด๋ ธํ ์ด์ (annotation)
@SpringBootTest
ํ ์คํธ ํด๋์ค์ SpringBootTest ์ด๋ ธํ ์ด์ ์ ์ฌ์ฉํ๋ฉด ํด๋น ํ ์คํธ๋ฅผ ์งํํ๊ธฐ ์ํด SpringBoot ์๋ฒ ์ ์ฒด๋ฅผ ๋์๋๋ค.
- ์ดํ๋ฆฌ์ผ์ด์
๋ ๋ฒจ ํ
์คํธ์ ์ฌ์ฉํฉ๋๋ค.
- ์๋ฒ ํ๋ก๊ทธ๋จ์ ํ๊ฒฝ์ค์ , ํฌํธ, ์ฃผ์ ๋ฑ ์คํ๋ ๋์ ๋ฐํ์ ํ ์คํธ
- ํตํฉ ํ ์คํธ ์ํ์ ์ ํฉํ๋๋ค.
- ํ ์คํธ ์คํ์ ์๋ฒ ์ดํ๋ฆฌ์ผ์ด์ ์ด ์คํ๋ฉ๋๋ค.
- ์ค์ ๊ตฌ๋๋๋ ์ดํ๋ฆฌ์ผ์ด์ ๊ณผ ๋๊ฐ์ Application Context๋ฅผ ๋ก๋ํฉ๋๋ค.
- ์ดํ๋ฆฌ์ผ์ด์
์ด ๋ก๋๋๊ธฐ ๋๋ฌธ์ ์ดํ๋ฆฌ์ผ์ด์
์ด ์ปค์ง ๊ฒฝ์ฐ ์๋๊ฐ ๋๋ ค์ง๋๋ค.
@WebMvcTest
- MVC๋ฅผ ์ํ ํ ์คํธ
- ๋ํ์ ์ผ๋ก Controller ํ ์คํธ๋ฅผ ํ ๋ ์ฌ์ฉํฉ๋๋ค.
- Request, Response๋ฅผ ํ ์คํธ ํ ์ ์๋ ์ด๋ ธํ ์ด์ ์ ๋๋ค.
- Spring Security๊ฐ ์ ๊ณตํ๋ ๋ก๊ทธ์ธ, ๋ก๊ทธ์์, ์ธ์ , ํํฐ๋ ์๋์ผ๋ก ํ ์คํธ ๋ฉ๋๋ค.
- @SpringBootTest ์ด๋ ธํ ์ด์ ์ ์ด์ฉํด๋ @WebMvcTest์์ ๊ฐ๋ฅํ ํ ์คํธ๋ ๋ชจ๋ ๊ฐ๋ฅํ์ง๋ง ์ดํ๋ฆฌ์ผ์ด์ ์ปจํ ์คํธ๋ฅผ ํตํด ์๋ฒ ์ฑ์ ์ ๋ถ ๋ก๋ํ๋ ๊ฒ์ด ์๋, MVC๊ด๋ จ ์ด๋ ธํ ์ด์ (@Controller, @ControllerAdvice, @JsonComponent)๊ณผ Filter, WebConfigurer, HandlerMethodArgumentResolver๋ง ๋ก๋ํ๊ธฐ ๋๋ฌธ์ ๋ฌด๊ฒ์ง ์์ต๋๋ค.
@BeforeEach
- ํ์ฌ ํด๋์ค์ ๊ฐ @Test, @RepeatedTest, @ParameterizedTest ๋๋ @TestFactory ๋ฉ์๋๋ณด๋ค ๋จผ์ ๋ฉ์๋๊ฐ ์คํ๋์ด์ผ ํ๋ ๊ฒ์ ์๋ฏธํฉ๋๋ค.
- ๋น์ฆ๋์ค ๋ก์ง์ด ๋ณต์กํด์ง๊ณ ํ ์คํธ์ ์ฌ๋ฌ ์ด๊ธฐํ๊ฐ ํ์ํ๋ค๋ฉด ์ฌ๋ฌ ๊ฐ์ @BeforeEach ๋ฉ์๋๋ฅผ ๋ง๋ค ์ ์์ต๋๋ค.
@BeforeEach
public void beforeEach(WebApplicationContext ctx,
RestDocumentationContextProvider restDocumentation) {
this.mvc = MockMvcBuilders.webAppContextSetup(ctx)
.addFilters(new SuccessResponseHeaderFilter()) //RestClient ์ํ ์ ๊ณตํต์ ์ธ successFilter
.apply(documentationConfiguration(restDocumentation))
.alwaysDo(print())
.build();
}
@AfterEach
- ํ์ฌ ํด๋์ค์ ๊ฐ @Test, @RepeatedTest, @ParameterizedTest ๋๋ @TestFactory ๋ฉ์๋ ์ดํ์ ๋ฉ์๋๊ฐ ์คํ๋์ด์ผ ํจ์ ์๋ฏธํฉ๋๋ค.
- ํ ์คํธ๊ฐ ์คํจํด๋ ์ํํ๊ฒ ๋ฉ๋๋ค.
์ฐธ๊ณ :
'Java' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Java] ์ ์ ๋ฉค๋ฒ์ Static (0) | 2023.11.09 |
---|---|
Java ์์์ ์์ธ์ฒ๋ฆฌ (0) | 2023.06.03 |
[Java] ์ ๊ทผ ์ ํ์๋ ๋ฌด์์ธ๊ฐ (0) | 2023.03.08 |
์๋ฐ์ ์๋ฃ๊ตฌ์กฐ - ์ปฌ๋ ์ ํ๋ ์์ํฌ(Collection Framework) (0) | 2023.02.05 |
[Java] extends ์ implements ์ ์ฐจ์ด (0) | 2023.01.10 |