미운 오리 새끼의 우아한 개발자되기

[Spring Boot] Cloud Native Java - Test(2) 슬라이스 - @WebMvcTest 본문

Spring & Spring Boot/Spring Boot

[Spring Boot] Cloud Native Java - Test(2) 슬라이스 - @WebMvcTest

Serina_Heo 2022. 9. 27. 13:03

@WebMevTest 는 스프링 부트 애플리케이션에서 개별 스프링 MVC 컨트롤러의 테스트를 지원하며, 아래 예제와 같이 컨트롤러 메소드와의 상호작용을 테스트할 수 있도록 스프링 MVC Infrastructure 를 자동 설정한다.

package demo.account;

import org.junit.Test;
import org.junit.runner.RunWith;
import org.springramework.beans.factory.annotation.Autowired;
import org.springramework.boot.test.autoconfigure.web.servlet.WebMvcTest;
import org.springramework.boot.test.mock.mockito.MockBean;
import org.springramework.http.MideaType;
import org.springramework.test.context.junit4.SpringRunner;
import org.springramework.test.servlet.MockMvc;

import java.util.Collections;

import static org.mockito.BDDMockito.given;
import static org.springframework.test.web.servlet.request.MockMvcRequesstBuilders.get;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.content;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;

@RunWith(SpringRunner.class)
@WebMvcTest(AccountController.class)
public class AccountControllerTest {
    
    // 스프링 MVC 컨트롤러에 HTTP 요청을 보내는 MVC 클라이언트 모의 객체를 주입받는다
    @Autowired
    private MockMvc mvc;
    
    // AccountController 가 의존하는 AccountService 에 대한 모의 객체를 생성한다
    @MockBean
    private AccountService accountService;
    
    @Test
    public void getUserAccountShouldReturnAccounts() throws Exception {
    	String content = "[{\"username\": \"user\", \"accountNumber\": \"123456789\"}]";
        
        // 모의 객체인 AccountService 의 getUserAccounts() 가 특정값을 반환하도록 Stub 한다
        given(this.accountService.getUserAccounts()).willReturn(
        	Collections.singletonList(new Account("user": "123456789")));
        
        // 마지막으로 MockMvc 클라이언트를 활용해서 실제 AccountController 가 반환하는 값과 테스트에서 예상한 값이 일치하는지 판정한다
        this.mvc.perform(get("/v1/accounts").accept(MediaType.APPLICATION_JSON))
        	.andExpect(status().isOK()).andExpect(content().json(content));
    }
}

MockMvc 는 스프링 MVC 테스트 프레임워크에서 제공하는 클래스다.

테스트는 실제 서블릿 컨테이너를 제외한 모든 스프링 MVC 기능을 사용할 수 있도록 설정되며, 클라이언트의 요청은 테스트 대상 컨트롤러로 전달된다. 컨트롤러는 요청에 대한 응답을 만들어서 클라이언트에 반환한다. 이 방식은 요청을 받아주는 실제 HTTP 서비스가 없다는 점을 제외하면 네트워크를 통해서 실제 서비스에 요청을 보내는 것과 거의 똑같다. ServerSocket 을 통해 요청이 전달되기 전까지는 어떤 것도 미리 동작하지 않는다. 

[Reference] Cloud Native Java - Josh Long, Kenny Bastani, 책만