์ถ์ฒ : ๋ด์ผ๋ฐฐ์์บ ํ
์ ๋(๋จ์) ํ ์คํธ : ๋ฉ์๋ ๋จ์๋ก ํ ์คํธ๋ฅผ ์ํ
ํตํฉ ํ ์คํธ : ์ดํ๋ฆฌ์ผ์ด์ ์ ์ ์ฒด ๋์์ด ์ ์์ ์ผ๋ก ๋์ํ๋์ง ์ํ
F.I.R.S.T ์์น
- Fast : ๋จ์ ํ ์คํธ๋ ๋นจ๋ผ์ผ ํ๋ค.
- Independent : ๋จ์ ํ ์คํธ๋ ๊ฐ๊ฐ์ ํ ์คํธ๊ฐ ์ฐ๊ด๋์ง ์๊ณ , ๊ณ ๋ฆฝ๋์ด์ผ ํ๋ค. ์ฆ ๋ ๋ฆฝ์ ์ด์ด์ผ ํ๋ค.
- Repeatable : ๋จ์ํ ์คํธ๋ ๋ฐ๋ณต ๊ฐ๋ฅํด์ผํ๋ค. ๋ฐ๋ณต์ ์ผ๋ก ํ ์คํธ๋ฅผ ์ํํด๋, ๊ฒฐ๊ณผ๋ ๊ฐ์์ผ ํ๋ค.
- Self-validating : ์์ฒด์ ์ผ๋ก ํ ์คํธ ๊ฒฐ๊ณผ๊ฐ ๋์ถ๋์ผํ๋ค. (๊ฐ๋ฐ์๊ฐ print ์ฐ์ด์ ๋น๊ตํ๋๊ฒ ์๋๊ณ ์๋์ผ๋ก ์ํ๋๋ฉฐ ์ฑ๊ณต/์คํจ ์ ๊ฒฐ๊ณผ๊ฐ ๋์ค๋ ๊ฒ)
- Timely : ๋จ์ ํ ์คํธ๋ ์ค์ ์ฝ๋๋ณด๋ค ๋จผ์ ๊ตฌํํด์ผํ๋ค. (TDD์ผ ๊ฒฝ์ฐ์๋ง ํด๋น)
Given-When-Then ํจํด
- Given : ํ ์คํธ์ ํ์ํ ๋ณ์๋ฅผ ์ ์ํ๊ฑฐ๋ Mock ๊ฐ์ฒด๋ฅผ ํตํด ํน์ ์ํฉ์ ๋ํ ํ๋์ ์ ์
- When: ์ค์ ํ ์คํธ๋ฅผ ํ๋ ๋ฉ์๋๊ฐ ํธ์ถ๋๋ฉฐ ํ ์คํธ๋ฅผ ํตํ ๊ฒฐ๊ณผ๊ฐ์ ๊ฐ์ ธ์จ๋ค.
- Then: When ๋จ๊ณ์์ ๋์จ ๊ฒฐ๊ณผ๊ฐ์ ๊ฒ์ฆํ๋ ์์ ์ ์ํ
Junit + Mockito
Junit : ์๋ฐ์ ํ ์คํธ ํ๋ ์์ํฌ
Mockito : Mock ๊ฐ์ฒด ์์ฑ, ๊ด๋ฆฌ, ๊ฒ์ฆ ํ๋ ์์ํฌ
~ ๊ฐ์ง ๊ฐ์ฒด์ ์์กด์ฑ ์ฃผ์ ์ ์ํด ํ์ํ ์ด๋ ธํ ์ด์
@Mock : Mock ๊ฐ์ฒด ์์ฑ ๋ฐ ๋ฐํ ์ด๋ ธํ ์ด์
@Spy : Stubํ์ง ์์ ๋ฉ์๋(๊ฐ์ง ๋ฉ์๋๊ฐ ์๋)๋ ์๋ณธ ๋ฉ์๋ ๊ทธ๋๋ก ์ฌ์ฉํ๋ ์ด๋ ธํ ์ด์
@InjectMocks : @Mock ๋๋ @Spy๋ก ์์ฑ๋ ๊ฐ์ง ๊ฐ์ฒด ์๋ ์ฃผ์ ์ด๋ ธํ ์ด์
ex) UserController ๋จ์ ํ ์คํธ๋ฅผ ์งํํ ๋, @Mock ์ด๋ ธํ ์ด์ ์ ํตํด ๊ฐ์ง UserService๋ฅผ ๋ง๋ค๊ณ , @InjectMocks๋ฅผ ํตํด UserController์ ์ด๋ฅผ ์ฃผ์ ํ ์ ์๋ค
@ExtendWith(MockitoExtension.class) : Junit๊ณผ Mockito๋ฅผ ์ฐ๊ฒฐ์์ผ์ฃผ๋ ์ด๋ ธํ ์ด์
@DisplayName(" ") : ํ ์คํธ ๋ฉ์๋ ๋ผ๋ฒจ๋ง ์ด๋ ธํ ์ด์
Junit์ ์๋ช ์ฃผ๊ธฐ
ํ ์คํธ ์์์ ๊ด์ฌํ๊ฒ ๋๋ ์ด๋ ธํ ์ด์
@BeforeAll : ํ ์คํธ ์์ ์ ํธ์ถ๋๋ ๋ฉ์๋
@BeforeEach : ๊ฐ ํ ์คํธ ๋ฉ์๋ ์คํ ์ ํธ์ถ๋๋ ๋ฉ์๋
@AfterAll : ํ ์คํธ ์ข ๋ฃ ์ ํธ์ถ๋๋ ๋ฉ์๋
@AfterEach : ๊ฐ ํ ์คํธ ๋ฉ์๋ ์ข ๋ฃ ์ ํธ์ถ๋๋ ๋ฉ์๋
์์ ํฌ์ธํธ
-> ๋ฉ์๋ ๋ด ์ข ์์ฑ ๊ฐ์ฒด๋ Mockingํด ๊ฐ์ง ๊ฐ์ฒด๋ฅผ ๋ง๋ค๊ณ ํด๋น ๋น์ฆ๋์ค ๋ก์ง์ด ์ ์์ ์ผ๋ก ์๋ํ๋ ๊ฒ๋ง์ ๋ณด๋ ๊ฒ์ด๋ค.
ex) ์๋น์ค ๋จ์ํ ์คํธ๋ฅผ ์งํํ ๋, DB ๊ฒ์ ๋ฑ์ ์ํํ์ง ์๋๋ค
-> ๋ฐํ ๊ฐ์ด ์๋ ๋ฉ์๋๋ ์ํ๋์ง ์๋๋ค.
-> Then ๋จ๊ณ์์๋ ์ฃผ๋ก assert ๋ฌธ์ ์ฌ์ฉํ๋ค.
-> HttpServletResponse๋ ํด๋นํ๋ Mock ๊ฐ์ฒด(MockHttpServletResponse ํ์ )๋ฅผ ์์ฑํด ์ธ์ ๊ฐ์ผ๋ก ํ์ฉํ๋ฉด ๋๋ค
01.30
ํ ์คํธ ํด๋์ค ์์ฑ - ์๋ฒ ๊ตฌ๋๋ฐฉ๋ฒ ์ ํ(@ExtendWtih ๋ฑ) - ํ๋ ์์ฑ + Mocking - ๋ฉ์๋ ์์ฑ (when - given - then)- ํ ์คํธ
๊ฐ์์์ ์ฌ์ฉํ MockMvcBuilders ํด๋์ค
์ ๋ฒ ์ค์ต ๋ ๋ณธ @SpringBootTest + MockMvc + @TestConstructor
https://gaemi606.tistory.com/entry/JUnit-5-ExtendWith-MockMvc-TestConstructor
* ์ปจํธ๋กค๋ฌ ๋ ์ด์ด์ ๋ํ ๋จ์ ํ ์คํธ๋ ๊ทธ ๋ก์ง์ด ๋ณต์กํ์ง ์๊ณ ํ ์คํธ ํ์์ฑ์ด ๋ค๋ฅธ ํ ์คํธ์ ๋นํด ํฌ์ง ์์ ๋จ์ ํ ์คํธ ์ฝ๋ ์์ฑ์ ํ์์ฑ์ด ๋จ์ด์ง๋ค & ๋ค๋ฅธ ํ๋ก์ ํธ์ ์ปจํธ๋กค๋ฌ ํ ์คํธ ์ฝ๋์ ์ ์ฌํ ์ ์ด ๋ง๋ค
~ ํตํฉํ ์คํธ, ํฌ์คํธ๋งจ์ ํตํ ํ ์คํธ๊ฐ ๋ณด๋ค ๋ฐ๋์งํ๋ค
๋ ํฌ์งํ ๋ฆฌ ํ ์คํธ : ๊ธฐ๋ณธ ๋ฉ์๋๋ ์ด๋ฏธ ์์ฑ๋์ด ์ ๊ณต๋๊ธฐ ๋๋ฌธ์ ํ ์คํธํ ํ์ ์๋ค
Mocking ํ ํ์ ์๋ค