programing

통합 테스트에서 MockMvc와 RestTemplate의 차이점

lastmemo 2023. 2. 20. 23:53
반응형

통합 테스트에서 MockMvc와 RestTemplate의 차이점

Spring JUnit과의 통합 테스트에는 MockMvc와 RestTemplate가 모두 사용됩니다.

문제는 이 두 회사의 차이점은 무엇이며, 언제 하나를 선택해야 하는가 하는 것입니다.

다음은 두 가지 옵션의 예입니다.

//MockMVC example
mockMvc.perform(get("/api/users"))
            .andExpect(status().isOk())
            (...)

//RestTemplate example
ResponseEntity<User> entity = restTemplate.exchange("/api/users",
            HttpMethod.GET,
            new HttpEntity<String>(...),
            User.class);
assertEquals(HttpStatus.OK, entity.getStatusCode());

이 기사에서 설명한 바와 같이,MockMvc애플리케이션의 서버측을 테스트하는 경우:

Spring MVC Test는 모의 요구 및 응답에 기초합니다.spring-test실행 중인 서블릿 컨테이너가 필요하지 않습니다.주된 차이점은 실제 Spring MVC 설정은 Test Context 프레임워크를 통해 로드되며 요구는 실제로 를 호출함으로써 실행된다는 것입니다.DispatcherServlet및 실행 시 사용되는 모든 Spring MVC 인프라스트럭처와 동일합니다.

예를 들어 다음과 같습니다.

@RunWith(SpringJUnit4ClassRunner.class)
@WebAppConfiguration
@ContextConfiguration("servlet-context.xml")
public class SampleTests {

  @Autowired
  private WebApplicationContext wac;

  private MockMvc mockMvc;

  @Before
  public void setup() {
    this.mockMvc = webAppContextSetup(this.wac).build();
  }

  @Test
  public void getFoo() throws Exception {
    this.mockMvc.perform(get("/foo").accept("application/json"))
        .andExpect(status().isOk())
        .andExpect(content().contentType("application/json"))
        .andExpect(jsonPath("$.name").value("Lee"));
  }}

그리고.RestTemplateRest Client 측 응용 프로그램을 테스트할 때 사용해야 합니다.

를 사용하는 코드가 있는 경우RestTemplate테스트하고 싶은 경우 실행 중인 서버를 대상으로 하거나 RestTemplate를 모의할 수 있습니다.클라이언트 측 REST 테스트 지원은 세 번째 대안을 제시합니다. 즉, 실제 REST 테스트에서는RestTemplate커스텀으로 설정합니다.ClientHttpRequestFactory는 실제 요구에 대한 기대를 체크하고 stub 응답을 반환합니다.

예:

RestTemplate restTemplate = new RestTemplate();
MockRestServiceServer mockServer = MockRestServiceServer.createServer(restTemplate);

mockServer.expect(requestTo("/greeting"))
  .andRespond(withSuccess("Hello world", "text/plain"));

// use RestTemplate ...

mockServer.verify();

예도 읽어주세요.

와 함께MockMvc일반적으로 웹 애플리케이션 컨텍스트 전체를 설정하고 HTTP 요청 및 응답을 조롱합니다.그래서 비록 가짜지만DispatcherServlet는 가동되고 있으며 MVC 스택의 기능을 시뮬레이트하고 있으며 실제 네트워크 접속은 확립되어 있지 않습니다.

와 함께RestTemplate송신하는 HTTP 요구를 리슨하려면 실제 서버인스턴스를 전개해야 합니다.

RestTemplate와 MockMvc를 모두 사용할 수 있습니다!

이는 Java 객체를 URL에 매핑하고 Json에서 변환하는 번거로운 작업을 이미 수행하고 있는 별도의 클라이언트가 있어 MockMVC 테스트에 재사용하고 싶을 때 유용합니다.

방법은 다음과 같습니다.

@RunWith(SpringRunner.class)
@ActiveProfiles("integration")
@WebMvcTest(ControllerUnderTest.class)
public class MyTestShould {

    @Autowired
    private MockMvc mockMvc;

    @Test
    public void verify_some_condition() throws Exception {

        MockMvcClientHttpRequestFactory requestFactory = new MockMvcClientHttpRequestFactory(mockMvc);
        RestTemplate restTemplate = new RestTemplate(requestFactory);

        ResponseEntity<SomeClass> result = restTemplate.getForEntity("/my/url", SomeClass.class);

        [...]
    }

}

언급URL : https://stackoverflow.com/questions/25901985/difference-between-mockmvc-and-resttemplate-in-integration-tests

반응형