[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.이 말대로 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.MockMvc를 사용하면 일반적으로 전체 웹 응용 프로그램 컨텍스트를 설정하고 HTTP 요청 및 응답을 조롱합니다. 따라서 가짜 DispatcherServlet이 실행 되어도 MVC 스택이 어떻게 작동하는지 시뮬레이션하면 실제 네트워크 연결이 이루어지지 않습니다.
MockMvc를 사용하면 일반적으로 전체 웹 응용 프로그램 컨텍스트를 설정하고 HTTP 요청 및 응답을 조롱합니다. 따라서 가짜 DispatcherServlet이 실행 되어도 MVC 스택이 어떻게 작동하는지 시뮬레이션하면 실제 네트워크 연결이 이루어지지 않습니다.
RestTemplate을 사용하면 보내는 HTTP 요청을 수신 대기하도록 실제 서버 인스턴스를 배포해야합니다.
-
==============================
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); [...] } }
from https://stackoverflow.com/questions/25901985/difference-between-mockmvc-and-resttemplate-in-integration-tests by cc-by-sa and MIT license
'SPRING' 카테고리의 다른 글
[SPRING] 자바 프레임 워크 전쟁 : 봄과 겨울잠 (0) | 2019.03.02 |
---|---|
[SPRING] Intellij IDEA : JPA 유효성 검사를위한 데이터 소스 지정 (0) | 2019.03.02 |
[SPRING] IntelliJ IDEA는 Spring의 @Autowired 주석을 사용할 때 오류를 표시합니다. (0) | 2019.03.02 |
[SPRING] Spring Security의 프로그램 적 사용 (0) | 2019.03.02 |
[SPRING] Spring MVC 애플리케이션의 서비스 레이어에 어떤 명명 규칙을 사용합니까? [닫은] (0) | 2019.03.02 |