MockRestServiceServer:如何用正文模拟 POST 调用?
MockRestServiceServer: how to mock a POST call with a body?
我正在尝试通过以下方式使用 MockRestServiceServer
模拟 POST 方法:
MockRestServiceServer server = bindTo(restTemplate).build();
server.expect(requestTo("/my-api"))
.andExpect(method(POST))
.andRespond(withSuccess(expectedResponce, APPLICATION_JSON));
问题:如何在此设置中验证请求正文?
我浏览了 the documentation 和一些示例,但仍然无法弄清楚如何完成。
您可以使用content().string验证正文:
.andExpect(content().string(expectedContent))
this.mockServer.expect(content().bytes("foo".getBytes()))
this.mockServer.expect(content().string("foo"))
我会怎么做这样的测试。我希望在模拟服务器上以 String
格式接收正确的正文,如果已收到此正文,服务器将以 String
格式的正确响应正文进行响应。当我收到响应主体时,我会将其映射到 POJO 并检查所有字段。另外,我会在发送之前将请求从 String
映射到 POJO。所以现在我们可以检查映射是否双向工作,我们可以发送请求和解析响应。代码将是这样的:
@Test
public void test() throws Exception{
RestTemplate restTemplate = new RestTemplate();
URL testRequestFileUrl = this.getClass().getClassLoader().getResource("post_request.json");
URL testResponseFileUrl = this.getClass().getClassLoader().getResource("post_response.json");
byte[] requestJson = Files.readAllBytes(Paths.get(Objects.requireNonNull(testRequestFileUrl).toURI()));
byte[] responseJson = Files.readAllBytes(Paths.get(Objects.requireNonNull(testResponseFileUrl).toURI()));
MockRestServiceServer server = bindTo(restTemplate).build();
server.expect(requestTo("http://localhost/my-api"))
.andExpect(method(POST))
.andExpect(content().json(new String(requestJson, "UTF-8")))
.andRespond(withSuccess(responseJson, APPLICATION_JSON));
UriComponentsBuilder uriBuilder = UriComponentsBuilder.fromHttpUrl("http://localhost/my-api");
ObjectMapper objectMapper = new ObjectMapper();
EntityOfTheRequest body = objectMapper.readValue(requestJson, EntityOfTheRequest.class);
RequestEntity.BodyBuilder bodyBuilder = RequestEntity.method(HttpMethod.POST, uriBuilder.build().toUri());
bodyBuilder.accept(MediaType.APPLICATION_JSON);
bodyBuilder.contentType(MediaType.APPLICATION_JSON);
RequestEntity<EntityOfTheRequest> requestEntity = bodyBuilder.body(body);
ResponseEntity<EntityOfTheResponse> responseEntity = restTemplate.exchange(requestEntity, new ParameterizedTypeReference<EntityOfTheResponse>() {});
assertThat(responseEntity.getBody().getProperty1(), is(""));
assertThat(responseEntity.getBody().getProperty2(), is(""));
assertThat(responseEntity.getBody().getProperty3(), is(""));
}
可能使用HttpMessageConverter 会有帮助。
根据document,HttpMessageConverter::read方法可以是提供检查输入能力的地方。
我正在尝试通过以下方式使用 MockRestServiceServer
模拟 POST 方法:
MockRestServiceServer server = bindTo(restTemplate).build();
server.expect(requestTo("/my-api"))
.andExpect(method(POST))
.andRespond(withSuccess(expectedResponce, APPLICATION_JSON));
问题:如何在此设置中验证请求正文?
我浏览了 the documentation 和一些示例,但仍然无法弄清楚如何完成。
您可以使用content().string验证正文:
.andExpect(content().string(expectedContent))
this.mockServer.expect(content().bytes("foo".getBytes()))
this.mockServer.expect(content().string("foo"))
我会怎么做这样的测试。我希望在模拟服务器上以 String
格式接收正确的正文,如果已收到此正文,服务器将以 String
格式的正确响应正文进行响应。当我收到响应主体时,我会将其映射到 POJO 并检查所有字段。另外,我会在发送之前将请求从 String
映射到 POJO。所以现在我们可以检查映射是否双向工作,我们可以发送请求和解析响应。代码将是这样的:
@Test
public void test() throws Exception{
RestTemplate restTemplate = new RestTemplate();
URL testRequestFileUrl = this.getClass().getClassLoader().getResource("post_request.json");
URL testResponseFileUrl = this.getClass().getClassLoader().getResource("post_response.json");
byte[] requestJson = Files.readAllBytes(Paths.get(Objects.requireNonNull(testRequestFileUrl).toURI()));
byte[] responseJson = Files.readAllBytes(Paths.get(Objects.requireNonNull(testResponseFileUrl).toURI()));
MockRestServiceServer server = bindTo(restTemplate).build();
server.expect(requestTo("http://localhost/my-api"))
.andExpect(method(POST))
.andExpect(content().json(new String(requestJson, "UTF-8")))
.andRespond(withSuccess(responseJson, APPLICATION_JSON));
UriComponentsBuilder uriBuilder = UriComponentsBuilder.fromHttpUrl("http://localhost/my-api");
ObjectMapper objectMapper = new ObjectMapper();
EntityOfTheRequest body = objectMapper.readValue(requestJson, EntityOfTheRequest.class);
RequestEntity.BodyBuilder bodyBuilder = RequestEntity.method(HttpMethod.POST, uriBuilder.build().toUri());
bodyBuilder.accept(MediaType.APPLICATION_JSON);
bodyBuilder.contentType(MediaType.APPLICATION_JSON);
RequestEntity<EntityOfTheRequest> requestEntity = bodyBuilder.body(body);
ResponseEntity<EntityOfTheResponse> responseEntity = restTemplate.exchange(requestEntity, new ParameterizedTypeReference<EntityOfTheResponse>() {});
assertThat(responseEntity.getBody().getProperty1(), is(""));
assertThat(responseEntity.getBody().getProperty2(), is(""));
assertThat(responseEntity.getBody().getProperty3(), is(""));
}
可能使用HttpMessageConverter 会有帮助。 根据document,HttpMessageConverter::read方法可以是提供检查输入能力的地方。