1.1 ๋ชจํ‚คํ†  ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ

์˜ค๋Š˜ ์šฐ๋ฆฌ๋Š” ๊ณ ๊ธ‰ ํ…Œ์ŠคํŠธ์— ๋Œ€ํ•ด ์•Œ๊ฒŒ ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋ณด๋‹ค ๊ตฌ์ฒด์ ์œผ๋กœ Mockito ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค . ์ด ์‚ฌ์—…์—์„œ ๋ฒ—์–ด๋‚  ์ƒ๊ฐ์กฐ์ฐจ ํ•˜์ง€ ๋งˆ์‹ญ์‹œ์˜ค.

์ฒซ์งธ, ์ด ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋Š” Spring ํ…Œ์ŠคํŠธ ์˜ ํ‘œ์ค€์ž…๋‹ˆ๋‹ค . ์‹ค์ œ๋กœ Java ๋ฐฑ์—”๋“œ ๊ฐœ๋ฐœ ์—…๊ณ„์˜ ํ‘œ์ค€์ž…๋‹ˆ๋‹ค.

๋‘˜์งธ, Spring ์ฝ”๋“œ์— ๋Œ€ํ•œ ํ…Œ์ŠคํŠธ๋ฅผ ์ž‘์„ฑํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค . ์ž‘์„ฑํ•œ ๋ฐฑ์—”๋“œ๊ฐ€ ์ œ๋Œ€๋กœ ์ž‘๋™ํ•˜๋Š”์ง€ ์ดํ•ดํ•˜๋Š” ์œ ์ผํ•œ ๋ฐฉ๋ฒ•์€ ํ•ด๋‹น API์˜ ๋ฉ”์†Œ๋“œ๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค . ๊ทธ๋ฆฌ๊ณ  ํ…Œ์ŠคํŠธ๋ฅผ ํ†ตํ•ด ์ˆ˜ํ–‰ํ•˜๋Š” ๊ฒƒ์ด ๊ทธ๋ ‡์ง€ ์•Š์€ ๊ฒƒ๋ณด๋‹ค 10๋ฐฐ ๋” ์‰ฝ์Šต๋‹ˆ๋‹ค. ์ง์ ‘ ํ™•์ธํ•˜์‹ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

pom.xml๋‹ค์Œ ์ฝ”๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ Mockito ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์ถ”๊ฐ€ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

<dependency>
    <groupId>org.mockito</groupId>
    <artifactId>mockito-junit-jupiter</artifactId>
    <version>4.2.0</version>
    <scope>test</scope>
</dependency>

Mockito ํ”„๋กœ์ ํŠธ์˜ ์ „์ฒด ์†Œ์Šค ์ฝ”๋“œ๋Š” GitHub ์—์„œ ์ฐพ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค .

1.2 ๋ชจ์˜ ๊ฐ์ฒด

๊ทธ๋ ‡๋‹ค๋ฉด ์ด Mockito๋Š” ๋ฌด์—‡์ด๋ฉฐ ์™œ ๊ทธ๋ ‡๊ฒŒ ์ข‹์€๊ฐ€์š”?

ํ…Œ์ŠคํŠธ ๊ฐœ๋ฐœ ๋ฐ ๊ฐœ๋ฐœ ๊ณผ์ •์—์„œ ์‹ค์ œ ๊ฐœ์ฒด ๋Œ€์‹  ์ผ์ข…์˜ "์Šคํ…"์„ ์ฝ”๋“œ์— ์‚ฝ์ž…ํ•ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋งค์šฐ ๋งŽ์•˜์Šต๋‹ˆ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด, ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์™€ ํ•จ๊ป˜ ์ž‘๋™ํ•˜๋Š” ์ฝ”๋“œ๋Š” ํ…Œ์ŠคํŠธ๋˜๊ณ  ๊ฑฐ๊ธฐ์—์„œ ๋ฌด์–ธ๊ฐ€๋ฅผ ๋ณ€๊ฒฝํ•ฉ๋‹ˆ๋‹ค. ๊ฐ ํ…Œ์ŠคํŠธ ์ „์— ์ด ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์˜ ์ƒํƒœ๊ฐ€ ๋™์ผํ•œ ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค(๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด ํ…Œ์ŠคํŠธ๊ฐ€ ๋‹ฌ๋ผ์ง‘๋‹ˆ๋‹ค). ๊ทธ๋ฆฌ๊ณ  ์ด๋Ÿฌํ•œ ์ƒํƒœ๋ฅผ ๋น ๋ฅด๊ฒŒ ๋กค๋ฐฑํ•˜๊ธฐ ์œ„ํ•ด ๋ฒ ์ด์Šค๊ฐ€ ๋” ๊ฐ„๋‹จํ–ˆ์œผ๋ฉด ํ•ฉ๋‹ˆ๋‹ค.

๋˜๋Š” ์˜ˆ๋ฅผ ๋“ค์–ด ์œ ์šฉํ•œ SMS๋ฅผ ๋ณด๋‚ด๋Š” ์ฝ”๋“œ๋ฅผ ํ…Œ์ŠคํŠธํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๋‹ค์ด๋ ‰ํŠธ ๋ฉ”์ผ๋ง์˜ ๊ฒฝ์šฐ ์ผ์ข…์˜ ์œ ๋ฃŒ SMS ๊ฒŒ์ดํŠธ์›จ์ด๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ์ดํ•ดํ•  ์ˆ˜์—†๋Š” ์‚ฌ๋žŒ๋“ค์—๊ฒŒ ์ˆ˜๋ฐฑ ๊ฐœ์˜ SMS๋ฅผ ๋ณด๋‚ด์ง€ ์•Š๋„๋ก ์ฝ”๋“œ๋ฅผ ํ…Œ์ŠคํŠธํ•˜๊ธฐ ์œ„ํ•ด ์ผ๋ถ€ ๊ฐ€์ƒ ๊ฒŒ์ดํŠธ์›จ์ด๋ฅผ ์—ฌ๊ธฐ์— ๋„ฃ๋Š” ๊ฒƒ์ด ์ข‹์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋˜๋Š” ์ฝ”๋“œ๊ฐ€ ํ…Œ์ŠคํŠธ ์„œ๋ฒ„์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๋Š” ๋‹ค๋ฅธ ์›น ์„œ๋ฒ„์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์š”์ฒญํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๋˜๋Š” 50๋ฒˆ ํ…Œ์ŠคํŠธํ•ด์•ผ ํ•˜๋Š” ์˜จ๋ผ์ธ ๊ฒฐ์ œ์šฉ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๊ณ  ์‹ค์ œ ๊ธˆ์œต ์ฑ„๋„์—์„œ๋งŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋‚˜๋Š” ๋‹น์‹ ์ด ์ดํ•ดํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค ... ๊ฐ€์ƒ ๊ฐ์ฒด ๋˜๋Š” ์Šคํ… ๊ฐ์ฒด๋ผ๊ณ ๋„ํ•˜๋Š” ๊ฐ€์ƒ ๊ฐ์ฒด๋Š” ๋งค์šฐ ์œ ์šฉํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๊ทธ๋ฆฌ๊ณ  ์—ฌ๊ธฐ์— ์–ด๋ ค์›€์ด ์žˆ์Šต๋‹ˆ๋‹ค. Java์—๋Š” ์ •์  ํƒ€์ดํ•‘์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ฆ‰, ์œ ํ˜•์˜ ๊ฐœ์ฒด ๋Œ€์‹  ReadDatabase๋ณ€์ˆ˜์— ๊ฐœ์ฒด์— ๋Œ€ํ•œ ์ฐธ์กฐ๋ฅผ ํ• ๋‹น ํ•˜๋ ค๋ฉด ์—์„œ VirtualDatabaseํด๋ž˜์Šค๋ฅผ ์ƒ์†ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค .VirtualDatabaseRealDatabase

๊ทธ๋Ÿฐ ๋‹ค์Œ ํด๋ž˜์Šค์—๋Š” RealDatabase๋‹ค๋ฅธ ์‹ค์ œ ๊ฐœ์ฒด์— ๋Œ€ํ•œ ์ฐธ์กฐ๋ฅผ ์ €์žฅํ•˜๋Š” ๋งŽ์€ ๊ฐœ์ธ ๋ฉ”์„œ๋“œ์™€ ๋ณ€์ˆ˜๊ฐ€ ์žˆ์œผ๋ฉฐ ์ด๋Ÿฌํ•œ ๋ฐฉ์‹์œผ๋กœ ์ผ๋ฐ˜ ์Šคํ…์„ ์ž‘์„ฑํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ์ด๋ก ์ ์œผ๋กœ๋Š” ์ข‹์ง€๋งŒ ์‹ค์ œ๋กœ๋Š” ๋ง‰ ๋‹ค๋ฅธ ๊ณจ๋ชฉ์ž…๋‹ˆ๋‹ค.

๊ทธ๋ฆฌ๊ณ  ์—ฌ๊ธฐ Java 5์— ๋‹ค์‹œ ๋“ฑ์žฅํ•œ ๊ตฌ์กฐ ( DynamicProxy์ž์„ธํ•œ ๋‚ด์šฉ์„ ์ฝ์„ ์ˆ˜ ์žˆ์Œ )๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ๋ถˆ๋งŒ์„ ์ œ๊ธฐํ•˜์ง€ ์•Š๋Š” ๊ฐ€์ƒ ๊ฐœ์ฒด๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด๋Ÿฌํ•œ ๊ฐ€์ƒ ๊ฐœ์ฒด๋ฅผ ๋ชจ์˜ ๋ผ๊ณ  ํ•ฉ๋‹ˆ๋‹ค (๋ชจ์˜ ๋ ˆ์ด์•„์›ƒ์ด๋ผ๋Š” ๋‹จ์–ด์—์„œ ์œ ๋ž˜). Mockito ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋Š” ์ด๋Ÿฌํ•œ ๋ชจ์˜ ๊ฐ์ฒด๋กœ ์ž‘์—…์„ ์ „๋ก€ ์—†๋Š” ์ˆ˜์ค€์œผ๋กœ ๋Œ์–ด์˜ฌ๋ฆด ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๊ฑด ๊ทธ๋ ‡๊ณ , ๋„์„œ๊ด€์˜ ์ด๋ฆ„์ž…๋‹ˆ๋‹ค.

1.3 @ExtendWith ์ฃผ์„

Mockito ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋Š” JUnit๊ณผ ์ž˜ ์ž‘๋™ํ•˜๋ฉฐ JUnit์˜ ํ™•์žฅ์œผ๋กœ ๊ฐ„์ฃผ๋  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

๋‹จ์œ„ ํ…Œ์ŠคํŠธ์—์„œ Mockito ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ํ™œ์„ฑํ™”ํ•˜๋Š” ๋ฐฉ๋ฒ•์—๋Š” ๋‘ ๊ฐ€์ง€๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์ฒซ ๋ฒˆ์งธ ๋ฐฉ๋ฒ•์€ ํŠน์ˆ˜ ์ฃผ์„์„ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

@ExtendWith(MockitoExtension.class)
public class MockitoAnnotationTest {
    ...
}

๋‘ ๋ฒˆ์งธ ๋ฐฉ๋ฒ•์€ ๋ฉ”์†Œ๋“œ๋ฅผ ํ˜ธ์ถœํ•˜์—ฌ ์ž‘์—…์„ ํ™œ์„ฑํ™”ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค openMocks().

public class MockitoAnnotationTest {
    @BeforeEach
    public void init() {
        MockitoAnnotations.openMocks(this);
   }
}

๋Œ€๋ถ€๋ถ„์˜ ๊ฒฝ์šฐ ์ฒซ ๋ฒˆ์งธ ์˜ต์…˜์ด ํ‘œ์‹œ๋˜์ง€๋งŒ ๋‘ ๋ฒˆ์งธ ์˜ต์…˜์ด ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ์•„๋Š” ๊ฒƒ์ด ์œ ์šฉํ•  ๋•Œ๋„ ์žˆ์Šต๋‹ˆ๋‹ค.