๐ง 1. Mockito๋? (์ ์ฌ์ฉํ๋๊ฐ?)
Mockito ๋ Java์์ ๋จ์ ํ ์คํธ๋ฅผ ์ํ Mocking ํ๋ ์์ํฌ์ ๋๋ค. ํน์ ๊ฐ์ฒด๋ฅผ ์ค์ ๊ฐ์ฒด์ฒ๋ผ ํ๋ด ๋ด๋ ๊ฐ์ง(Mock) ๊ฐ์ฒด๋ก ๋ง๋ค์ด์, ํ ์คํธ ์ค ํน์ ๋์์ ์ ์ํ๊ณ ์์ ๊ฒฐ๊ณผ๋ฅผ ๊ฒ์ฆํ ์ ์๋ค.
โ ์ Mocking์ด ํ์ํ ๊น?
- ๋ฐ์ดํฐ๋ฒ ์ด์ค ์์กด์ฑ ์ ๊ฑฐ: Repository๋ ์ธ๋ถ API๋ฅผ ์ง์ ํธ์ถํ๋ฉด ํ ์คํธ๊ฐ ๋๋ ค์ง๊ณ ํ๊ฒฝ์ ์์กด์ ์ด ๋๋ค.
- ์ ํํ ํ ์คํธ ๋ณด์ฅ: ํน์ ๋ฉ์๋๊ฐ ์ ํํ ๊ฐ์ ๋ฐํํ๋์ง ๋ ๋ฆฝ์ ์ผ๋ก ํ ์คํธ๊ฐ ๊ฐ๋ฅํ๋ค.
- ํ ์คํธ ์๋ ํฅ์: ์ค์ DB ์ฐ๊ฒฐ ์์ด ์ํ๋ ๊ฐ์ ๋ณํํ๋๋ก ์ค์ ํ๋ฉด ๋น ๋ฅธ ํ ์คํธ๊ฐ ๊ฐ๋ฅํ๋ค.
๐ฅ Mock์ ์ฌ์ฉํด์ผ ํ๋ ๊ฒฝ์ฐ vs ์ฌ์ฉํ์ง ์์์ผ ํ๋ ๊ฒฝ์ฐ
Mock์ ์ฌ์ฉํด์ผ ํ๋ ๊ฒฝ์ฐ | Mock์ ์ฌ์ฉํ์ง ์์์ผ ํ๋ ๊ฒฝ์ฐ |
๋ฐ์ดํฐ๋ฒ ์ด์ค ์์ด ๋ ๋ฆฝ์ ์ธ ํ ์คํธ๊ฐ ํ์ํ ๋ | ์ค์ ๋ฐ์ดํฐ์ ํ๋ฆ์ ๊ฒ์ฆํด์ผ ํ ๋ |
์ธ๋ถ API ํธ์ถ ์์ด ๋น ๋ฅด๊ฒ ํ ์คํธํ๊ณ ์ถ์ ๋ | ํตํฉ ํ ์คํธ๋ E2E ํ ์คํธ๋ฅผ ์งํํ ๋ |
ํน์ ๋ฉ์๋์ ๋์์ ๋จ๋ ์ผ๋ก ๊ฒ์ฆํ๊ณ ์ถ์ ๋ | ํธ๋์ญ์ ์ด ์ฌ๋ฐ๋ฅด๊ฒ ์ฒ๋ฆฌ๋๋์ง ํ์ธํ ๋ |
์ฆ, ๋จ์ ํ ์คํธ์์๋ Mock์ ์ ๊ทน์ ์ผ๋ก ์ฌ์ฉํ๊ณ ,
ํตํฉ ํ ์คํธ(E2E ํ ์คํธ)์์๋ ์ค์ DB์ API๋ฅผ ํ์ฉํ๋ ๊ฒ์ด ๋ ์ ์ ํ๋ค.
๐ 2. @Mock๊ณผ @InjectMocks์ ์๋ฆฌ
โ @Mock
- Mockito์์ ํน์ ๊ฐ์ฒด๋ฅผ Mockingํ ๋ ์ฌ์ฉํ๋ค.
- ์๋ ๊ฐ์ฒด๋ฅผ ์์ฑํ๋ ๋์ , ํด๋น ๊ฐ์ฒด์ ๊ฐ์ง(Stub) ๊ฐ์ฒด๋ฅผ ์์ฑํ๋ค.
- when().thenReturn()์ผ๋ก ์ํ๋ ๋์์ ๋ฏธ๋ฆฌ ์ ์ ๊ฐ๋ฅํ๋ค.
โ @InjectMocks
- @Mock์ผ๋ก ๋ง๋ค์ด์ง ๊ฐ์ฒด๋ฅผ ์๋์ผ๋ก ์ฃผ์
(Inject)ํ์ฌ,
์ฐ๋ฆฌ๊ฐ ํ ์คํธํ๋ ค๋ @InjectMocks ๋์ ํด๋์ค์์ ์ฌ์ฉํ ์ ์๋๋ก ํ๋ค.
๐ ์์ ์ฝ๋
@Mock
private SolutionRepository solutionRepository; // Mock ๊ฐ์ฒด ์์ฑ
@InjectMocks
private SolutionService solutionService; // solutionRepository๊ฐ ์๋ ์ฃผ์
๋จ
์ ์ฝ๋์์ solutionRepository๋ Mock ๊ฐ์ฒด์ด์ง๋ง, solutionService์์๋ ์๋ ๊ฐ์ฒด์ฒ๋ผ ์ฌ์ฉ ๊ฐ๋ฅํ๋ค.
๐ 3. Mockito๊ฐ ์ค์ ๋ก ์ด๋ป๊ฒ ๋์ํ๋๊ฐ?
Mockito๋ ํ๋ก์(Proxy) ๊ฐ์ฒด๋ฅผ ์์ฑํด์ ์๋ ๊ฐ์ฒด์ฒ๋ผ ๋์ํ๊ฒ ๋ง๋ค์ด.
- @Mock์ ์ฌ์ฉํ๋ฉด, ์ค์ ๊ฐ์ฒด๊ฐ ์๋๋ผ Proxy ๊ฐ์ฒด๊ฐ ์์ฑ๋๋ค.
- when().thenReturn()์ ์ฌ์ฉํ๋ฉด ํน์ ๋ฉ์๋๊ฐ ํธ์ถ๋ ๋ ๋ฏธ๋ฆฌ ์ ์๋ ๊ฐ์ ๋ฐํํ๋๋ก ์ค์ ๋๋ค.
- @InjectMocks๊ฐ ์ฌ์ฉ๋ ํด๋์ค์๋ @Mock์ผ๋ก ๋ง๋ ๊ฐ์ง ๊ฐ์ฒด๊ฐ ์ฃผ์ ๋๋ค.
- ์ค์ ๋ฉ์๋ ํธ์ถ ์, Mock ๊ฐ์ฒด๋ ์๋ ๋ก์ง์ ์คํํ์ง ์๊ณ Mockito๊ฐ ๋ฏธ๋ฆฌ ์ค์ ํ ๊ฐ์ ๋ฐํํ๋ค.
๐ 4. ์ฝ๋ ์์ : Repository๋ฅผ Mockingํ ๋จ์ ํ ์คํธ
@Test
void givenMoreThan100Solutions_whenCheckingThreshold_thenReturnsTrue() {
// given
String problemId = "1000";
String language = "Java";
// Mock ๊ฐ์ฒด์ ๋์์ ์ค์ (์ค์ DB์ ์ ๊ทผํ์ง ์์)
when(solutionRepository.countByProblemIdAndLanguage(problemId, language))
.thenReturn(150L); // 150๊ฐ๋ก ์ค์
// when
boolean result = solutionService.hasAtLeast100Solutions(problemId, language);
// then
assertTrue(result);
}
โ ํ ์คํธ ์ฝ๋ ์คํ ํ๋ฆ
- solutionRepository.countByProblemIdAndLanguage(problemId, language) ํธ์ถ๋๋ค.
- ์ค์ ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ฅผ ์กฐํํ์ง ์๊ณ , when().thenReturn(150L)์ด ์ค์ ํ ๊ฐ์ ๋ฐํํ๋ค.
- solutionService.hasAtLeast100Solutions()์์ count >= 100์ ์ฒดํฌํ์ฌ true ๋ฐํํ๋ค.
- assertTrue(result);์์ ๊ฒ์ฆ ์ฑ๊ณต! โ
๐ต๏ธโ๏ธ 5. Mockito ๋ด๋ถ ๋์์ ๋๋ฒ๊น ํด๋ณด๊ธฐ
ํ
์คํธ ์ค์ Mockito์ Mock ๊ฐ์ฒด๊ฐ ์ด๋ป๊ฒ ๋์ํ๋์ง ํ์ธํ๋ ค๋ฉด,
System.out.println()์ ์ถ๊ฐํ๊ฑฐ๋ ๋๋ฒ๊ฑฐ๋ฅผ ํ์ฉํ ์ ์๋ค.
@Test
void debugMockitoBehavior() {
// given
String problemId = "2000";
String language = "Python";
when(solutionRepository.countByProblemIdAndLanguage(problemId, language))
.thenReturn(80L); // 80๊ฐ๋ก ์ค์
System.out.println("Mock ๊ฐ์ฒด ํธ์ถ ์ "); // ๋๋ฒ๊น
์ฉ ๋ก๊ทธ
// when
boolean result = solutionService.hasAtLeast100Solutions(problemId, language);
System.out.println("Mock ๊ฐ์ฒด๊ฐ ๋ฐํํ ๊ฐ: "
+ solutionRepository.countByProblemIdAndLanguage(problemId, language));
// then
assertFalse(result);
}
โ ์ถ๋ ฅ ๊ฒฐ๊ณผ
Mock ๊ฐ์ฒด ํธ์ถ ์
Mock ๊ฐ์ฒด๊ฐ ๋ฐํํ ๊ฐ: 80
- solutionRepository.countByProblemIdAndLanguage()๊ฐ ์ค์ DB๋ฅผ ์กฐํํ ๊ฒ ์๋๋ผ,
Mockito๊ฐ ์ค์ ํ ๊ฐ(80)์ ๋ฐํํ ๊ฑธ ํ์ธํ ์ ์๋ค.
โจ ๊ฒฐ๋ก
โ
@Mock์ ๊ฐ์ง ๊ฐ์ฒด๋ฅผ ๋ง๋ค์ด์ ํ
์คํธ ์ ์์กด์ฑ์ ์ ๊ฑฐํ๊ณ ๋
๋ฆฝ์ ์ธ ํ
์คํธ๊ฐ ๊ฐ๋ฅํ๊ฒ ํจ.
โ
@InjectMocks๋ฅผ ์ฌ์ฉํ๋ฉด, Mock ๊ฐ์ฒด๋ฅผ ์๋์ผ๋ก ์ฃผ์
ํ์ฌ ์๋ ์๋น์ค ํด๋์ค์ฒ๋ผ ์ฌ์ฉ ๊ฐ๋ฅ.
โ
when().thenReturn()์ ํ์ฉํ๋ฉด ํน์ ๋ฉ์๋ ํธ์ถ ์ ์ํ๋ ๊ฐ์ ๋ฐํํ๋๋ก ์ค์ ํ ์ ์์.
โ
Mockito๋ ํ๋ก์ ๊ฐ์ฒด๋ฅผ ์์ฑํ์ฌ ์ค์ ๊ฐ์ฒด์ฒ๋ผ ๋์ํ๊ฒ ํ๋ ์๋ฆฌ๋ก ์๋ํจ.
'AlgoMate' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
Celery + Redis vs Celery + RabbitMQ: ์ด๋ค ์ ํ์ด ๋ ๋์๊น? (0) | 2025.02.17 |
---|---|
๐ ๋์ ์ผ๋ก ํ์ผ์ ์ ๊ณตํ๋ ๋ฐฉ๋ฒ (2) | 2025.02.16 |
AlgoMate#3 - docker ๋ก ๋์ด DB ์ ์ ๊ทผํ๊ธฐ(PostgreSQL) (2) | 2025.02.01 |
AlgoMate#2 - Jplag๋ฅผ ํตํ ์ ์ฌ๋ ๊ฒ์ฌ (2) | 2025.02.01 |
Algomate#1 - ๋ด ์ ๋ต๊ณผ ์ ์ฌํ ์๊ณ ๋ฆฌ์ฆ์ ์ ๋ต์ ์ถ์ฒํด์ค๋ค๊ณ ??! (0) | 2025.01.30 |