๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ

Spring

[TEST] ์Šคํ”„๋ง์—์„œ์˜ TEST, ๊ทธ๋ฆฌ๊ณ  ์ผ๋ฐ˜์  TEST

๐Ÿ“Œ ์Šคํ”„๋ง์—์„œ์˜ TEST= MockMvc์™€ @MockBean

์Šคํ”„๋ง test

 

  • @WebMvcTest : ์Šคํ”„๋ง MVC components์— ์ตœ์ ํ™”๋œ test๋‹ค.
" a Spring MVC test that focuses only on Spring MVC components. "
  • ๋‹จ, full auto-configuration ์˜ annotation์—์„œ๋Š” ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๋‹ค. ์˜ค๋กœ์ง€ MVC test์—๋งŒ ๊ฐ€๋Šฅํ•˜๋‹ค. ์˜ˆ๋ฅผ ๋“ค๋ฉด @Controller, @ControllerAdvice, WebMvcConfigurer, HandlerMethodArgumentResolver ๋งŒ์ด ๊ฐ€๋Šฅํ•˜๊ณ  @Component, @Service or @Repository์˜ test๋กœ๋Š” ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๋‹ค.
  • ๋”ฐ๋ผ์„œ @Service or @Repository์˜ test๋กœ๋Š” ์ผ๋ฐ˜ ํ…Œ์ŠคํŠธ๋ฅผ ์ด์šฉํ•ด์•ผํ•œ๋‹ค. ์Šคํ”„๋ง์ด ์•„๋‹ˆ๋ผ ์ผ๋ฐ˜์ ์ธ ํ…Œ์ŠคํŠธ ์ด๋ฏ€๋กœ @Autowired๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๋‹ค.
  • ์ผ๋ฐ˜์ ์œผ๋กœ @WebMvcTest๋Š” @Controller ์™€ ๊ด€๋ จ๋œ ๋นˆ์„ ํ•จ๊ป˜ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด @MockBean or @Import ๋ฅผ ์ง€์ •ํ•œ๋‹ค.
  • @MockBean : ๊ฐ€์งœ bean, ์‹ค์ œ ์„œ๋น„์Šค์™€ ์ƒ๊ด€์—†์ด ํ…Œ์ŠคํŠธ๊ฐ€ ๊ฐ€๋Šฅํ•œ ์ด์œ ๋‹ค. 
  • MVC๋ฅผ ์œ„ํ•œ ํ…Œ์ŠคํŠธ, ์›น์—์„œ ํ…Œ์ŠคํŠธํ•˜๊ธฐ ํž˜๋“  ์ปจํŠธ๋กค๋Ÿฌ๋ฅผ ํ…Œ์ŠคํŠธํ•˜๋Š”๋ฐ ์ ํ•ฉํ•˜๋‹ค.
  • ์›น์ƒ์—์„œ ์š”์ฒญ๊ณผ ์‘๋‹ต์— ๋Œ€ํ•œ ํ…Œ์ŠคํŠธ ์ง„ํ–‰ํžŒ๋‹ค.
  • security ํ˜น์€ filter ๊นŒ์ง€ ์ž๋™์œผ๋กœ ํ…Œ์ŠคํŠธํ•˜๋ฉฐ ์ˆ˜๋™์œผ๋กœ ์ถ”๊ฐ€/์‚ญ์ œ ๊ฐ€๋Šฅ
  • ํ…Œ์ŠคํŠธ์—์„œ @Transactional์„ ์‚ฌ์šฉํ•˜๋ฉด ํ…Œ์ŠคํŠธ๋ฅผ ๋งˆ์น˜๊ณ  ๋‚˜์„œ ์ˆ˜์ •๋œ ๋ฐ์ดํ„ฐ๊ฐ€ ๋กค๋ฐฑ๋œ๋‹ค.

+) @SpyBean ์ปจํŠธ๋กค๋Ÿฌ์— ์ €์žฅ์†Œ์— ๋Œ€ํ•œ ๊ฐ์ฒด๋ฅผ ์ฃผ์ž…ํ•  ์ˆ˜ ์žˆ๋Š” ๋˜ ๋‹ค๋ฅธ ๋ฐฉ๋ฒ•์ด๋‹ค. ๊ตฌํ˜„์ฒด๋ฅผ ๋ช…์‹œ ํ•ด์ฃผ์–ด์•ผํ•œ๋‹ค. 

ํ•˜์ง€๋งŒ, ์ด ๋ฐฉ์‹์€ ํ…Œ์ŠคํŠธ ํ•˜๊ณ ์ž ํ•˜๋Š” ๊ฐ์ฒด ์™ธ์˜ ๊ฒƒ๋“ค๋„ ๋ชจ๋‘ ์˜์กดํ•ด์ฃผ์–ด์•ผ ํ•œ๋‹ค. Mock ๊ฐ์ฒด๊ฐ€ ํ•„์š”ํ•˜๋‹ค๋Š” ์–˜๊ธฐ๋‹ค. 

Mock ๊ฐ์ฒด ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ mokito๋‹ค. spring์—์„œ ์ด๋Ÿฐ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ๊ฐ€์ ธ์˜ค๊ธฐ ๋•Œ๋ฌธ์— ๋ฐ”๋กœ ํ…Œ์ŠคํŠธ ํ•  ์ˆ˜ ์žˆ๋‹ค.

 

์–ด๋…ธํ…Œ์ด์…˜ ์„ค๋ช… Bean
@WebMvcTest ๋‹จ์œ„ ํ…Œ์ŠคํŠธ, Mvc ํ…Œ์ŠคํŠธ MVC ๊ด€๋ จ๋œ Bean
@SpringBootTest ํ†ตํ•ฉ ํ…Œ์ŠคํŠธ, ์ „์ฒด Bean ์ „์ฒด
@MockBean ๊ฐ€์งœ Bean  

 

 

 

๐Ÿ“Œ ์ผ๋ฐ˜ TEST์˜ @Mock์™€ @BeforeEach, MokitoAnnotations.openMocks

 

  • ์ผ๋ฐ˜ํ…Œ์ŠคํŠธ์—์„œ๋Š” @MockBean, @Autowired๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์œผ๋ฏ€๋กœ, @Mock์„ ์‚ฌ์šฉํ•œ๋‹ค.
  • ๋˜ํ•œ, ์˜์กด์„ฑ ์ฃผ์ž…์ด ๋ถˆ๊ฐ€ํ•˜๋ฏ€๋กœ ์ง์ ‘ ์—ฐ๊ฒฐํ•  ์ˆ˜ ์žˆ๋„๋ก @BeforeEach์„ ์‚ฌ์šฉํ•˜๋Š”๋ฐ, ์ด๊ฑด ๋งค ๋‹จ์œ„ ํ…Œ์ŠคํŠธ ๋งˆ๋‹ค. ๋””ํดํŠธ ๊ฐ’์ฒ˜๋Ÿผ ๋จผ์ € ์‹คํ–‰๋˜๋Š” ๋ฉ”์†Œ๋“œ์— ์ง€์ •ํ•œ๋‹ค. ๋•Œ๋งˆ๋‹ค ์ฃผ์ž…์ด ๋œ๋‹ค. ๋…ธ๊ฐ€๋‹ค ์ฃผ์ž…(?). ์‚ฌ์‹ค์€ Mockito๋ผ๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ DI๋„๊ตฌ๋กœ์จ ๋™์ž‘ํ•˜๋Š”๊ฑฐ๋‹ค.
  • MockitoAnnotations.openMocks(this)
    • this : ํ…Œ์ŠคํŠธ ํด๋ž˜์Šค ์ž์ฒด
    • ํ…Œ์ŠคํŠธ ํด๋ž˜์Šค์˜ @Mock ํ•„๋“œ์— ๋Œ€ํ•ด ๋ชจ๋‘ ์ธ์Šคํ„ด์Šค ํ•ฉ์„ฑ
    • @InjectMocks ํ•„๋“œ์— ๋ชจ๋“  Mock ์ธ์Šคํ„ด์Šค ์ฃผ์ž