복붙노트

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

SPRING

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

MockMvc와 RestTemplate은 Spring과 JUnit의 통합 테스트에 사용됩니다.

문제는 그들과 우리가 서로를 선택해야 할 때의 차이점은 무엇입니까?

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

//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());

해결법

  1. ==============================

    1.이 말대로 article MockMvc를 사용하여 응용 프로그램의 서버 측을 테스트해야 할 때 :

    이 말대로 article MockMvc를 사용하여 응용 프로그램의 서버 측을 테스트해야 할 때 :

    예 :

    @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().mimeType("application/json"))
            .andExpect(jsonPath("$.name").value("Lee"));
      }}
    

    그리고 나머지 클라이언트 측 응용 프로그램을 테스트 할 때 사용해야하는 RestTemplate :

    예:

    RestTemplate restTemplate = new RestTemplate();
    MockRestServiceServer mockServer = MockRestServiceServer.createServer(restTemplate);
    
    mockServer.expect(requestTo("/greeting"))
      .andRespond(withSuccess("Hello world", "text/plain"));
    
    // use RestTemplate ...
    
    mockServer.verify();
    

    이 예제를 읽는다.

  2. ==============================

    2.MockMvc를 사용하면 일반적으로 전체 웹 응용 프로그램 컨텍스트를 설정하고 HTTP 요청 및 응답을 조롱합니다. 따라서 가짜 DispatcherServlet이 실행 되어도 MVC 스택이 어떻게 작동하는지 시뮬레이션하면 실제 네트워크 연결이 이루어지지 않습니다.

    MockMvc를 사용하면 일반적으로 전체 웹 응용 프로그램 컨텍스트를 설정하고 HTTP 요청 및 응답을 조롱합니다. 따라서 가짜 DispatcherServlet이 실행 되어도 MVC 스택이 어떻게 작동하는지 시뮬레이션하면 실제 네트워크 연결이 이루어지지 않습니다.

    RestTemplate을 사용하면 보내는 HTTP 요청을 수신 대기하도록 실제 서버 인스턴스를 배포해야합니다.

  3. ==============================

    3.RestTemplate과 MockMvc를 모두 사용할 수 있습니다!

    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);
    
            [...]
        }
    
    }
    
  4. from https://stackoverflow.com/questions/25901985/difference-between-mockmvc-and-resttemplate-in-integration-tests by cc-by-sa and MIT license