통합 테스트에서 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"));
}}
그리고.RestTemplate
Rest 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
'programing' 카테고리의 다른 글
반응 JS 오류: 정의되지 않은 반응/jsx-no-def (0) | 2023.02.20 |
---|---|
SQL에서 값 목록을 테이블 행과 결합 (0) | 2023.02.20 |
json_encode(): 인수의 UTF-8 시퀀스가 잘못되었습니다. (0) | 2023.02.20 |
각도 - UI 라우터가 이전 상태를 가져옵니다. (0) | 2023.02.20 |
불변 @Configuration Properties (0) | 2023.02.20 |