Mock Object

ํ•ด์„ํ•˜๋ฉด ๋ชจ์˜ ๊ฐ์ฒด๋ผ๋Š” ์˜๋ฏธ๋กœ ํ”„๋กœ๊ทธ๋žจ์„ ํ…Œ์ŠคํŠธ ํ•  ๋•Œ ์‹ค์ œ ์‚ฌ์šฉํ•˜๋Š” ๋ชจ๋“ˆ(๊ฐ์ฒด)์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ  ์‹ค์ œ ๋ชจ๋“ˆ์„ ํ‰๋‚ด๋‚ด๋Š” ๊ฐ€์งœ ๋ชจ๋“ˆ์„ ์ž‘์„ฑํ•˜์—ฌ ํ…Œ์ŠคํŠธ ํšจ์šฉ์„ฑ์„ ๋†’์ด๋Š” ๊ฐ์ฒด

Stub๊ณผ์˜ ์ฐจ์ด์ 

Stub์€ ์ƒํƒœ ๊ฒ€์ฆ์— ์‚ฌ์šฉํ•˜๊ณ  Mock Object๋Š” ํ–‰์œ„ ๊ฒ€์ฆ์— ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด๋ผ๊ณ  ๋งˆํ‹ด ํŒŒ์šธ๋Ÿฌ๋Š” ์„ค๋ช…ํ•˜๊ณ  ์žˆ๋‹ค.

์ถœ์ฒ˜ : http://martinfowler.com/articles/mocksArentStubs.html

Spring ๋‹จ์œ„ ํ…Œ์ŠคํŠธ

@SpringBootTest

์ผ๋ฐ˜์ ์ธ ํ…Œ์ŠคํŠธ๋กœ slicing์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ  ์ „์ฒด ํ”„๋กœ๊ทธ๋žจ ์ปจํ…์ŠคํŠธ๋ฅผ ์‹œ์ž‘ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋ชจ๋“  ํŒŒ์ผ์„ ๋กœ๋“œํ•˜๊ณ  bean์„ ์ฃผ์ž…ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์†๋„๊ฐ€ ๋Š๋ฆฌ๋‹ค.

SpringBootTest์—์„œ MockMVC๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด @AutoConfigureMockMvc๋ฅผ ๋ถ™์—ฌ์ฃผ๋ฉด ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค. (๋‚ด๋ถ€์— webEnvirment์˜ ๊ธฐ๋ณธ๊ฐ’์ด mock์œผ๋กœ ๋˜์–ด์žˆ์–ด ์‚ฌ์šฉ ๊ฐ€๋Šฅ)

@WebMvcTest

MVC๋ฅผ ์œ„ํ•œ ํ…Œ์ŠคํŠธ๋กœ ๊ณ„์ธต๋ณ„๋กœ ๋‚˜๋ˆ„์–ด์„œ ์›น๊ณผ ๊ด€๋ จ๋œ ๋ถ€๋ถ„๋งŒ ํ…Œ์ŠคํŠธํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋น ๋ฅด๊ฒŒ ํ…Œ์ŠคํŠธ๊ฐ€ ๊ฐ€๋Šฅํ•˜๋‹ค.(์Šฌ๋ผ์ด์Šค ํ…Œ์ŠคํŠธ)

Contoller ๊ณ„์ธต๋งŒ ๋“ฑ๋ก (์„œ๋น„์Šค ๋“ฑ๋ก x) (@Controller, @ControlloerAdvice, @JsonComponent, @Conveter, @GenericConverter, @Filter, @handlerInterceptor,@WebMvcConfigurer ๋งŒ ์Šค์บ” )

MockMvc,MockBean์„ ์ž๋™ ์„ค์ •์„ ์ž๋™์œผ๋กœ ์„ค์ • ํ•ด์ฃผ๊ณ  Spring Security์˜ ํ…Œ์ŠคํŠธ๋„ ์ง€์›ํ•œ๋‹ค.

  • MockMvc : ์Šคํ”„๋ง MVC ํ…Œ์ŠคํŠธ ํ•ต์‹ฌ ํด๋ž˜์Šค ์›น ์„œ๋ฒ„๋ฅผ ๋œจ์œ„์ง€ ์•Š๊ณ ๋„ ์Šคํ”„๋ง MVC(DisapatcherServlet)์ด ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•˜๋Š” ๊ณผ์ •์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์–ด ์ปจํŠธ๋กค๋Ÿฌ ํ…Œ์ŠคํŠธ์šฉ์œผ๋กœ ์ž์ฃผ ์“ด๋‹ค. (๋‹จ์œ„ํ…Œ์ŠคํŠธ๋ณด๋‹ค๋Š” ๊ฐ์ฒด๋ฅผ ๋” ๋งŽ์ด ๋งŒ๋“ค๊ธฐ ๋•Œ๋ฌธ์— ๋น ๋ฅด์ง€๋Š” ์•Š๋‹ค.)

    • perform : ์‹ค์ œ ์š”์ฒญ์„ ์ˆ˜ํ–‰ํ•˜๋Š” ํ•จ์ˆ˜ ๋‚ด๋ถ€์— ํŒŒ๋ผ๋ฏธํ„ฐ๋“ค๋กœ RequestBuilder๋ฅผ ์ด์šฉํ•ด contentType, accept,content๋“ฑ ๋‹ค์–‘ํ•œ ๋ฉ”์„œ๋“œ๋“ค๋กœ ์š”์ฒญ ํ—ค๋”์— ๊ฐ’์„ setํ•  ์ˆ˜ ์žˆ๋‹ค.

      • MockMvcRequestBuilder์— ์˜ฌ ์ˆ˜ ์žˆ๋Š” ๋ฉ”์„œ๋“œ : post, get, delete,put,patch,options,head,request

    • andDo : perform ์ˆ˜ํ–‰ํ›„ ๋‚ด๋ถ€ ํŒŒ๋ผ๋ฏธํ„ฐ ๋ฉ”์„œ๋“œ๋ฅผ ์‹คํ–‰

    • andExpect : ์‘๋‹ต์œผ๋กœ ๊ธฐ๋Œ€ํ•˜๋Š” ๊ฐ’๋“ค์„ setting

    • andReturn

    Mock ๊ฐ์ฒด๋Š” return ๊ฐ’์ด null

  • MockBean ์Šคํ”„๋ง ๋ถ€ํŠธ ํ…Œ์ŠคํŠธ ํŒจํ‚ค์ง€ ๋‚ด๋ถ€์— ์กด์žฌํ•˜๊ณ  ํ…Œ์ŠคํŠธ ํ•˜๋ ค๋Š” ๊ธฐ์กด ๊ฐ์ฒด๋‚ด์˜ Bean์ด ์•„๋‹Œ MockBean์„ ์ฃผ์ž…ํ•ด ์‚ฌ์šฉํ•œ๋‹ค

    Mock๊ณผ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ mock๊ฐ์ฒด์˜ ํ–‰์œ„๋ฅผ ์ง€์ •ํ•ด ์ค„ ์ˆ˜ ์žˆ๋‹ค.

์›น ๊ด€๋ จ Bean๋งŒ ๋“ฑ๋ก์„ ํ•˜์—ฌ ์‚ฌ์šฉํ•˜๊ธฐ ๋•Œ๋ฌธ์— Repository๊ฐ™์€ Bean์„ ๋“ฑ๋กํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ์ด๋„ ๋“ฑ๋กํ•˜๋ ค๋ฉด MockBean(Spring Boot Test ๋‚ด๋ถ€์— ์กด์žฌ) ์„ ์ด์šฉํ•˜์—ฌ ํ…Œ์ŠคํŠธ๋ฅผ ์ง„ํ–‰ํ•ด์•ผ ํ•œ๋‹ค.

Mockito

Mock ๊ฐ์ฒด๋ฅผ ์ง์ ‘ ๋งŒ๋“ค์–ด ํ…Œ์ŠคํŠธ ์ฝ”๋“œ ์ž‘์„ฑํ•˜๋Š” ๊ฒƒ์€ ๋ฒˆ๊ฑฐ๋กญ๊ธฐ๋„ํ•˜๊ณ  Mockํด๋ž˜์Šค ๊ด€๋ฆฌ๋„ ๋ถ€๋‹ด์Šค๋Ÿฝ๊ธฐ ๋•Œ๋ฌธ์— ์‹œ๊ฐ„์„ ์ƒ๋Œ€์ ์œผ๋กœ ์ ˆ์•ฝํ•˜๊ธฐ ์œ„ํ•œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ

  • Mock Mockito ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๋‚ด๋ถ€์— ์œ„์น˜ํ•ด mock๊ฐ์ฒด๊ฐ€ ํŠน์ • ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœ ํ–ˆ์„ ๋•Œ ๋™์ž‘ํ•˜๋Š” ๋ฐฉ์‹์„ ์„ค์ •ํ•œ๋‹ค.

    Mockito.when(eventRepository.save(event)).thenReturn(event);

Last updated