๐ ์ค๋ ๋ฐฐ์ด ๋ด์ฉ!
- Mockito๋ฅผ ์ฌ์ฉํ ํ ์คํ ๋ฐฉ๋ฒ
โ๏ธ Mock
- not real, but intended to be very similar to a real situation, substance etc
( ๋ง ๊ทธ๋๋ก, ์ง์ง๋ ์๋์ง๋ง ์ง์ง์ ์์ฃผ ๋น์ทํ ๊ฐ์ง)
โ๏ธ ๋ชฉ์ (Mock-up)
- ์ค์ ์ ํ์ด ๋์ค๊ธฐ ์ ์ ๋ด๋ถ์ ์ผ๋ก ์ฌ์ฉํ๊ธฐ ์ํ ๋ชจํ(๊ฐ์ง) ์ ํ
- ํ ์คํธ ์ธ๊ณ์์๋ ๊ฐ์ง ๊ฐ์ฒด๋ฅผ ์๋ฏธ
โ๏ธ Mocking
- ๋จ์ ํ ์คํธ๋ ์ฌ๋ผ์ด์ค ํ ์คํธ ๋ฑ์ Mock ๊ฐ์ฒด๋ฅผ ์ฌ์ฉํ๋ ๊ฒ
โ ํ ์คํธ์์ Mock ๊ฐ์ฒด๋ฅผ ์ฌ์ฉํ๋ ์ด์
Mock ๊ฐ์ฒด๋ฅผ ์ฌ์ฉํ์ง ์๊ณ MemberController ํ ์คํธ ์ค postMember ํ ์คํธ๋ฅผ ์งํํ๋ค๊ณ ํ๋ฉด,
์ด์ ํ๋ฆ์ ์๋์ ๊ฐ์ ๊ฒ์ โฌ๏ธ
- MemberControllerTest ํด๋์ค ๋ด์ postMemberTest()
- MemberController ํด๋์ค ๋ด์
postMember()
- MemberService ํด๋์ค ๋ด์
createMember()
- MemberRepository ์ธํฐํ์ด์ค ๋ด์
save()
- H2
- ๋ค์ ๋ฐ๋๋ก ์ญ ๋์๊ฐ์ ํ ์คํธ ์ผ์ด์ค์ ๋๋ฌ
But, ์ด๋ ๊ฑฐ์ ๋ชจ๋ ๊ณ์ธต์ ๋๊ณ ์ค๊ธฐ ๋๋ฌธ์ ์์ ํ ์ฌ๋ผ์ด์ค ํ
์คํธ๊ฐ ์๋, ํตํฉํ
์คํธ์ ๊ฐ๊น์
โ โ Mock ๊ฐ์ฒด๋ฅผ ์ฌ์ฉํ์ฌ ๋ค๋ฅธ ๊ณ์ธต๊ณผ ๋จ์ ์ ์์ผ์ฃผ์ด
์ด ๊ณผ์ ์ ์ค์ฌ์ฃผ๊ณ ์ฌ๋ผ์ด์ค ํ
์คํธ๋ฅผ ์ ์ฉํ ์ ์๋๋ก ํ ๊ฒ !
- Mock ๊ฐ์ฒด๋ฅผ ์ฌ์ฉํ MemberController ํ
์คํธ ์ค postMember ํ
์คํธ์ ์งํ ํ๋ฆ์
- MemberControllerTest ํด๋์ค ๋ด์
postMemberTest()
- MemberController ํด๋์ค ๋ด์
postMember()
- MockMemberService ํด๋์ค ๋ด์
createMember()
- ๋ค์ ๋ฐ๋๋ก ์ญ ๋์๊ฐ์ ํ ์คํธ ์ผ์ด์ค์ ๋๋ฌ
- MemberControllerTest ํด๋์ค ๋ด์
โ๏ธ Mockito
- Mock ๊ฐ์ฒด๋ฅผ ์์ฑํ๊ณ ํด๋น Mock ๊ฐ์ฒด๊ฐ ์ง์ง์ฒ๋ผ ๋์ํ๊ฒ ํ๋ ๊ธฐ๋ฅ์ ํ๋ Mocking framework(๋๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ)
- Mockito์ Mocking ๊ธฐ๋ฅ์ ์ด์ฉํด์ ํ ์คํธํ๊ณ ์ ํ๋ ๋์์์ ๋ค๋ฅธ ์์ญ(๋ค๋ฅธ ๊ณ์ธต ๋๋ ์ธ๋ถ ํต์ ์ด ํ์ํ ์๋น์ค ๋ฑ)์ ๋จ์ ์์ผ ์ค๋ก์ง ํ ์คํธ ๋์์๋ง ์ง์คํ ์ ์๊ฒ ํจ
[์ฐธ๊ณ 1], [์ฐธ๊ณ 2]
[Mockito ๋ฉ์๋๋ค ์ฐธ๊ณ ], [Mockito ์ง์ Matchers ์ฐธ๊ณ ]
โ Mockito ์ง์ Stubbing ๋ฉ์๋
given(Mock ๊ฐ์ฒด ํด๋์ค๋ช .๋ฉ์๋๋ช (Mockito.any(๊ฐ์ฒดํ์ .class))).willReturn(๊ฐ์ฒด๋ช )
โ Mock ๊ฐ์ฒด์ธ ํด๋น ํด๋์ค๋ก ํด๋น ๋ฉ์๋๋ฅผ ํธ์ถํ๋๋ก ์ ์ํจ
โMockito.any()
๋ ์ด๋ค ํ์ ์ผ๋ก ํธ์ถ๋ ์ง ์ง์
โ.willReturn()
์ ์์ ํด๋น ๋ฉ์๋๊ฐ ๋ฆฌํดํ Stub ๋ฐ์ดํฐ
โ๏ธ Stubbing
- ํ ์คํธ๋ฅผ ์ํด์ Mock ๊ฐ์ฒด๊ฐ ํญ์ ์ผ์ ํ ๋์์ ํ๋๋ก ์ง์ ํ๋ ๊ฒ
โ๏ธ Stub
- ํธ์ถ์ ํญ์ ์ ํด์ง ํ๋์ ํ๊ฑฐ๋ ์ ํด์ง ๋ฐ์ดํฐ๋ฅผ ๋๋ ค์ฃผ๋ ์ปดํฌ๋ํธ
- ์ฃผ๋ก ํ ์คํธ์์ ์ฌ์ฉํ๊ธฐ ๋๋ฌธ์ Test Stub์ด๋ผ๊ณ ํจ
โ ์ฌ๋ผ์ด์ค ํ ์คํธ์ Mockito ์ ์ฉ
1. MemberController์ postMember() ํ ์คํธ์ Mockito ์ ์ฉ
@MockBean
์ ๋ํ ์ด์ ์ ์ฌ์ฉํ์ฌ ๊ฐ์ง ๊ฐ์ฒด๋ก ๋ง๋ค Service ํด๋์ค ์ง์ ํ, ํ๋์ DI [@MockBean ์ฐธ๊ณ ]
@Autowired
์ ๋ํ ์ด์ ์ ์ฌ์ฉํ์ฌ Dto ํด๋์ค๋ฅผ ๊ฐ์ธ์ ์์ฒญ/์๋ต์ ์ฒ๋ฆฌํ mapper ํด๋์ค๋ฅผ ํ๋์ DI
Ex. MemberControllerMockTest ํด๋์ค์ postMemberTest()
๋ฅผ ํธ์ถํ์ฌ ์คํํ ๊ฒฐ๊ณผ
โ MockMemberService์ createMember()
๋ฉ์๋๊ฐ ํธ์ถ๋๋ฏ๋ก, ๋ฐ์ดํฐ ์ก์ธ์ค ๊ณ์ธต์ชฝ์ ๋ก์ง์ ์คํ์ด ๋์ง ์์
โ MockMemberService ํด๋์ค๋ ์ฐ๋ฆฌ๊ฐ ํ ์คํธํ๊ณ ์ ํ๋ Controller์ ํ ์คํธ์ ์ง์คํ ์ ์๋๋ก ๋ค๋ฅธ ๊ณ์ธต๊ณผ์ ์ฐ๋์ ๋์ด์ฃผ๋ ์ญํ ์ ํ๋ ๊ฒ
2. MemberService์ createMember() ํ ์คํธ์ Mockito ์ ์ฉ
- ํด๋์ค ๋ ๋ฒจ์ @ExtendWith(MockitoExtension.class) ์ ์ฉ
โ Spring์ ์ฌ์ฉํ์ง ์๊ณ , Junit์์ Mockito์ ๊ธฐ๋ฅ์ ์ฌ์ฉํ๊ฒ ๋ค๋ ์๋ฏธ @Mock
์ ๋ํ ์ด์ ์ ์ฌ์ฉํ์ฌ Mock ๊ฐ์ฒด๋ก ๋ง๋ค Repository ํด๋์ค ์ง์ ํ, ํ๋์ DI@InjectMocks
์ ๋ํ ์ด์ ์ ์ฌ์ฉํ์ฌ Mock ๊ฐ์ฒด๋ฅผ ์ฃผ์ ํ Service ํด๋์ค ์ง์ ํ, ํ๋์ DI
โ๏ธ TDD (Test Driven Development)
- ํ ์คํธ ์ฃผ๋ ๊ฐ๋ฐ
- 'ํ
์คํธ๋ฅผ ๋จผ์ ํ๊ณ ๊ตฌํ์ ๊ทธ ๋ค์์ ํ๋ค'
( ํ ์คํธ ์ผ์ด์ค ๋จผ์ ์์ฑ ํ, ๊ทธ์ ๋ง๋ ์ ํจ์ฑ ๊ฒ์ฆ ๋ก์ง์ด๋ ํ์ฉํ ๋ฉ์๋ / ํด๋์ค๋ค์ ์์ฑํ์ฌfailed
ํ ์คํธ ์ผ์ด์ค๋ฅผpassed
๋ก ๋ฐ๊ฟ์ฃผ๋ ๊ฒ )
โ๏ธ DDD (Domain Driven Design)
- ๋๋ฉ์ธ ์ค์ฌ์ ์ค๊ณ ๊ธฐ๋ฒ
โ TDD ํน์ง
- ๋ชจ๋ ์กฐ๊ฑด์ ๋ง์กฑํ๋ ํ
์คํธ๋ฅผ ๋จผ์ ์งํํ ๋ค, ์กฐ๊ฑด์ ๋ง์กฑํ์ง ์๋ ํ
์คํธ๋ฅผ ๋จ๊ณ์ ์ผ๋ก ์งํํ๋ฉด์ ์คํจํ๋ ํ
์คํธ๋ฅผ ์ ์ง์ ์ผ๋ก ์ฑ๊ณต์์ผ ๊ฐ
- ์คํ ๊ฒฐ๊ณผ๊ฐ
failed
์ธ ํ ์คํธ ์ผ์ด์ค๋ฅผ ์ง์์ ์ผ๋ก ๊ทธ๋ฆฌ๊ณ ๋จ๊ณ์ ์ผ๋ก ์์ ํ๋ฉด์ ํ ์คํธ ์ผ์ด์ค ์คํ ๊ฒฐ๊ณผ๊ฐpassed
๊ฐ ๋๋๋ก ๋ง๋ฆ - ํ
์คํธ๊ฐ
passed
๋ ๋งํผ์ ์ฝ๋๋ง ์ฐ์ ์์ฑ ์คํจํ๋ ํ ์คํธ → ์คํจํ๋ ํ ์คํธ๋ฅผ ์ฑ๊ณตํ ๋งํผ์ ๊ธฐ๋ฅ ๊ตฌํ → ์ฑ๊ณตํ๋ ํ ์คํธ → ๋ฆฌํฉํ ๋ง → ์คํจํ๋ ํ ์คํธ์ ์ฑ๊ณตํ๋ ํ ์คํธ ํ์ธ
์ ํ๋ฆ ๋ฐ๋ณต
โ TDD ์ฅ์
- ํ
์คํธ๋ฅผ ํต๊ณผํ ๋งํผ์ ๊ธฐ์ฆ์ ๊ตฌํ
โ ํ๋ฒ์ ๋๋ฌด ๋ง์ ๊ธฐ๋ฅ ๊ตฌํ ํ์ X - ํ
์คํธ์ ์ฝ๋๊ฐ ์ถ๊ฐ๋๋ฉด์ ๊ฒ์ฆ ๋ฒ์๊ฐ ๋์ด์ง ์๋ก, ๊ธฐ๋ฅ ๊ตฌํ๋ ์ ์ง์ ์ผ๋ก ์์ฑ
โ ๋จ์ํ ๊ธฐ๋ฅ -> ๋ณต์กํ ๊ธฐ๋ฅ์ผ๋ก ํ์ฅ๋๋ฉด์ ๊ฒ์ฆ ๋นผ๋จน์ง ์๊ณ ๊ฐ๋ฅ - ๋ฆฌํฉํ ๋งํ ๋ถ๋ถ์ด ์๊ธฐ๋ฉด ๊ทธ๋ ๊ทธ๋ ๋ฆฌํฉํ ๋ง ๊ฐ๋ฅ
โ ๋ฆฌํฉํ ๋ง์ ๋น์ฉ ์๋์ ์ผ๋ก ์ ์ด์ง - ํญ์ ํ
์คํธ ์ผ์ด์ค๊ฐ ์กด์ฌํ๋ฏ๋ก ์ฝ๋ ์์ ์ ๋ํ ์ฌ๋ฆฌ์ ๋ถ์๊ฐ์ด ์ค์ด๋ฆ
- ๋ฆฌํฉํ ๋ง์ผ๋ก ๊พธ์คํ ์ฝ๋๋ฅผ ๊ฐ์ ํ๋ฏ๋ก ์ฝ๋์ ํ์ง์ ์ผ์ ๋ถ๋ถ ์ ์ง ๊ฐ๋ฅ
- ์ฝ๋ ์์ ์ดํ, ๋ฐ๋ก ํ
์คํธ ๊ฐ๋ฅ
โ ์ฝ๋ ์์ ๊ฒฐ๊ณผ์ ๋ํ ๋น ๋ฅธ ํผ๋๋ฐฑ
โ TDD ๋จ์
- ์์ง TDD ๋ฐฉ์์ด ์ต์์น ์๋ค๋ ์
- ํ
์คํธ ์ฝ๋ ์์ฑ์ ์ซ์ดํ๋ ์ฌ๋๋ค์๊ฒ๋ ๋ถ์ ์ ์ธ ๋ฐฉ์
But, ์ค๋ฌด์์๋ ๊ฒฐ๊ตญ ๊ผญ ํด์ผํจ - ํ ๋จ์๋ก ๊ฐ๋ฐ์ด ์งํ๋๋ ์ค๋ฌด์์๋ ํ์๋ค ๊ฐ ์ฌ์ ํ์๊ฐ ๋์ด์ผํจ
๐ ์ค์ต
- projects - be-template-testing-mock
- git - be-homework-testing-mock
But, ์ด๋ฒ ์ค์ต์ Mapper๋ฅผ ํ
์คํธ ๋์์ผ๋ก ๋ณด๊ณ ์์ง ์์ !
์ํฉ์ ๋ฐ๋ผ Mapper๋ ๋งคํ์ด ์ ๋๋์ง ํ ์คํธ ๊ฐ๋ฅ !
โ๏ธ UriComponentsBuilder ํด๋์ค๋ฅผ ์ด์ฉํ UriComponents ์ธ์คํด์ค ์์ฑ ๋ฐฉ๋ฒ
์๋๋ path ๋ก url์ ์ง์ ํ ๋,
mockMvc.perform(get("/v11/members/"+member.getMemberId()));
์ด๋ฐ ์์ผ๋ก ์ง์ ํ์์๋๋ฐ
์ ์์ ์ง์ ๋ฃ์ง ์๊ณ
URI uri = UriComponentsBuilder.newInstance().path("/v11/members").build().toUri();
์์ ๊ฐ์ด UriComponentsBuilder ํด๋์ค๋ฅผ ์ด์ฉํ์ฌ ์์ฑํด์ค ์ ์๋ค !
์ด ๊ฒฝ์ฐ path์๋ ๊ฐ๋จํ
mockMvc.perform(get(uri));
์ด๋ ๊ฒ๋ง ๋ฃ์ด์ฃผ๋ฉด ๋ฐ๋ก ์์ฑ ๊ฐ๋ฅ !
[์ฐธ๊ณ ] https://blog.naver.com/PostView.naver?blogId=aservmz&logNo=222322019981
๐ ๋๋์
Mockito๊ฐ ๋ค์ด๊ฐ๋๊น ์ข ์ด๋ ค์์ก๋คใ
ใ
์ฌ์ค ํ์ด์ ์ค์ตํ๋ฉด์ 1์๊ฐ ๋ฐ๋์ ์๋ฌ๋ค์ ํด๊ฒฐํ๋๋ผ 2๊ฐ์ ํ
์คํธ ์ผ์ด์ค๋ฐ์ ์๋ฃํ์ง ๋ชปํ๋ค.
๋์ ๋ฐฉ์๊ณผ ๋์ ์์, ๊ตฌ์ฑ ๋ฑ์ ์ ์ตํ์ ๋ค๋ฅธ ์ฝ๋๋ฅผ ์ฐธ๊ณ ํ์ง ์๊ณ ๋ ๋ฐ๋ก๋ฐ๋ก ํ
์คํธ ์ผ์ด์ค๋ฅผ ์์ฑํ ์ ์๋๋ก ํด์ผ์ง
( ๋ณธ ๊ฒ์๋ฌผ์ 2022/11/13์ ์์ฑํ ๊ธ์ ์ฎ๊ธด ๊ธ์ ๋๋ค. ์๋ฌธ์ ์๊ธฐ์ ์์! )
'โข CodeStates BootCamp > Section 3' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
๐ [Section3] 13. [ Spring MVC ] ์ ํ๋ฆฌ์ผ์ด์ ๋น๋/์คํ/๋ฐฐํฌ (0) | 2023.04.11 |
---|---|
๐ [Section3] 12. [ Spring MVC ] API ๋ฌธ์ํ (0) | 2023.04.11 |
๐ [Section3] 10. [ Spring MVC ] ํ ์คํ 1 (0) | 2023.04.11 |
๐ [Section3] 9. [ Spring MVC ] ํธ๋์ญ์ (0) | 2023.04.11 |
๐ [Section3] 8. [ Spring MVC ] Spring Data JPA 2 (0) | 2023.04.11 |