๐ŸŒฑ JAVA & SPRING/Spring

[spring-test] standaloneSetup() vs webAppContextSetup()

ming412 2023. 11. 24. 14:14

ํ”„๋กœ์ ํŠธ๋ฅผ ์ง„ํ–‰ํ•˜๋ฉฐ Spring Security๊ฐ€ ์ ์šฉ๋œ ๊ณณ์„ ํ…Œ์ŠคํŠธํ•˜๊ธฐ ์œ„ํ•ด `@WithSecurityContext` ๋ผ๋Š” ๋ฉ”ํƒ€ ์–ด๋…ธํ…Œ์ด์…˜์„ ์ด์šฉํ•ด ์ปค์Šคํ…€ ์–ด๋…ธํ…Œ์ด์…˜์„ ์ƒ์„ฑํ–ˆ๋‹ค. ํ•˜์ง€๋งŒ SecurityContext์— ํ…Œ์ŠคํŠธ์—์„œ ํ™œ์šฉํ•  ์ธ์ฆ ์ •๋ณด๋ฅผ ์ฃผ์ž…ํ–ˆ๋Š”๋ฐ๋„ ๊ณ„์†ํ•ด์„œ ์ธ์ฆ๋•Œ๋ฌธ์— ํ…Œ์ŠคํŠธ๊ฐ€ failํ•˜๋Š” ์ƒํ™ฉ์ด ๋ฐœ์ƒํ–ˆ๋‹ค..

 

๋ฌดํ•œ ์‚ฝ์งˆ์„ ํ†ตํ•ด MockMvc๋ฅผ ์ดˆ๊ธฐํ™”ํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋”ฐ๋ผ ํ…Œ์ŠคํŠธ ํ™˜๊ฒฝ์ด ๋‹ฌ๋ผ์ง์„ ๊นจ๋‹ฌ์•˜๋‹ค.

 

MockMvc

์‹ค์ œ๋กœ ๋„คํŠธ์›Œํฌ์— ์—ฐ๊ฒฐํ•˜์ง€ ์•Š๊ณ ๋„ API ํ…Œ์ŠคํŠธ๊ฐ€ ๊ฐ€๋Šฅํ•˜๋„๋ก ๋ชจํ‚น๋œ ๊ฐ์ฒด์ด๋‹ค. ์ฃผ๋กœ Controller ๋ ˆ์ด์–ด ๋‹จ์œ„ ํ…Œ์ŠคํŠธ์— ๋งŽ์ด ์‚ฌ์šฉ๋œ๋‹ค.

MockMvcBuilder๋ฅผ ์‚ฌ์šฉํ•ด์„œ ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ์…‹ํŒ…ํ•ด์ฃผ์–ด์•ผ ํ•˜๋Š”๋ฐ, `standaloneSetup` ํ˜น์€ `webAppContextSetup` ์ค‘ ํ•˜๋‚˜๋ฅผ ์…‹ํ•ด์ฃผ๋ฉด ๋œ๋‹ค.

 

MockMvcBuilders.standaloneSetup(Object... controllers)

- Spring ์ปจํ…์ŠคํŠธ๋ฅผ ๋กœ๋“œํ•˜์ง€ ์•Š๊ณ  Spring MVC์˜ DispatcherServlet๋งŒ ์ดˆ๊ธฐํ™”ํ•ฉ๋‹ˆ๋‹ค.

- ์ˆœ์ˆ˜ํ•œ Spring MVC ํ™˜๊ฒฝ์—์„œ ํŠน์ • ์ปจํŠธ๋กค๋Ÿฌ๋ฅผ ํ…Œ์ŠคํŠธํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.

- Spring ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ปจํ…์ŠคํŠธ ์„ค์ •์„ ๊ณ ๋ คํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ํ…Œ์ŠคํŠธ๊ฐ€ ๋น ๋ฅด๊ฒŒ ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค.

- ์ฃผ๋กœ Spring MVC ์ปจํŠธ๋กค๋Ÿฌ๋ฅผ ์œ ๋‹› ํ…Œ์ŠคํŠธํ•  ๋•Œ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.

public class DiaryControllerTest {

	@InjectMocks
	FriendshipController friendshipController;
    
	private MockMvc mockMvc;
    
    @BeforeEach
    public void init() {
        mockMvc = MockMvcBuilders.standaloneSetup(friendshipController).build();
    }
    ...
}

 

MockMvcBuilders.webAppContextSetup(WebApplcationContext context)

- ์Šคํ”„๋ง ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ „์ฒด ์ปจํ…์ŠคํŠธ๋ฅผ ๋กœ๋“œํ•˜์—ฌ ์‹ค์ œ ํ™˜๊ฒฝ๊ณผ ์œ ์‚ฌํ•œ ํ™˜๊ฒฝ์—์„œ ํ…Œ์ŠคํŠธ๋ฅผ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.

- ์Šคํ”„๋ง ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ปจํ…์ŠคํŠธ์˜ ์„ค์ •์„ ๊ณ ๋ คํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์Šคํ”„๋ง ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ํ†ตํ•ฉ ํ…Œ์ŠคํŠธ ์‹œ์— ์ฃผ๋กœ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.

- ์‹ค์ œ ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ํ™˜๊ฒฝ์„ ๋ชจ๋ฐฉํ•˜๋ฏ€๋กœ ์ปจํ…์ŠคํŠธ ์„ค์ •, ํ•„ํ„ฐ, ์ธํ„ฐ์…‰ํ„ฐ ๋“ฑ์„ ํฌํ•จํ•˜์—ฌ ๋” ๋งŽ์€ ๊ธฐ๋Šฅ์„ ํ…Œ์ŠคํŠธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

@WebMvcTest(FriendshipController.class)
public class DiaryControllerTest {

	@Autowired
    protected WebApplicationContext context;
    
    private MockMvc mockMvc;
    
    @BeforeEach
    public void init() {
        mockMvc = MockMvcBuilders.webAppContextSetup(context).build();
    }
    ...
}

 

์ปค์Šคํ…€ ์• ๋…ธํ…Œ์ด์…˜์ด ํ…Œ์ŠคํŠธ์— ์ ์šฉ๋˜์ง€ ์•Š์•˜๋˜ ์ด์œ 

๊ฒฐ๋ก ๋ถ€ํ„ฐ ๋งํ•˜์ž๋ฉด, standaloneSetup์„ ์‚ฌ์šฉํ•˜๋ฉด ์Šคํ”„๋ง ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ปจํ…์ŠคํŠธ๋ฅผ ๋กœ๋“œํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

 

`@WithMockCustomUser`๋ผ๋Š” ์• ๋…ธํ…Œ์ด์…˜์„ ์‚ฌ์šฉํ•˜๋ ค๋ฉด ์Šคํ”„๋ง ์‹œํ๋ฆฌํ‹ฐ์™€ ๊ด€๋ จ๋œ ์ปจํ…์ŠคํŠธ๋ฅผ ์„ค์ •ํ•ด์•ผ ํ•œ๋‹ค.

ํ•˜์ง€๋งŒ standaloneSetup์€ ์Šคํ”„๋ง ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ปจํ…์ŠคํŠธ๋ฅผ ๋กœ๋“œํ•˜์ง€ ์•Š๊ฒŒ ๋•Œ๋ฌธ์— ์Šคํ”„๋ง ์‹œํ๋ฆฌํ‹ฐ์™€ ๊ด€๋ จ๋œ ์„ค์ •์ด๋‚˜ ์ปค์Šคํ…€ ์• ๋…ธํ…Œ์ด์…˜์€ ์ด๋Ÿฌํ•œ ํ…Œ์ŠคํŠธ์—์„œ ์ ์šฉ๋˜์ง€ ์•Š๋Š”๋‹ค.

 

webAppContextSetup์„ ์ด์šฉํ•ด mockMvc๋ฅผ ์ฃผ์ž…ํ•˜์—ฌ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ–ˆ๋‹ค. ๐Ÿ˜ƒ

 

๐Ÿ”— ์ฐธ๊ณ 

[Spring-test] standaloneSetup vs webAppContextSetup