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, 책만