最近我开始使用Spring的MockRestServiceServer
来验证基于RestTemplate
的测试请求。
当它用于简单的get / post请求时 - 但是,我无法弄清楚如何将它与POST多部分请求一起使用:
例如,我想测试的工作代码如下所示:
public ResponseEntity<String> doSomething(String someParam, MultipartFile
file, HttpHeaders headers) { //I add headers from request
MultiValueMap<String, Object> map = new LinkedMultiValueMap<>();
map.add("file", new ByteArrayResource(file.getBytes()) {
@Override
public String getFilename() {
return file.getOriginalFilename();
}
});
map.add("someParam", someParam);
HttpEntity<MultiValueMap<String, Object>> requestEntity = new
HttpEntity<>(map, headers);
return this.restTemplate.exchange(
getDestinationURI(),
HttpMethod.POST,
requestEntity,
String.class);
}
所以我的问题是如何用org.springframework.test.web.client.MockRestServiceServer
指定我的期望?请注意,我不想仅仅使用mockito或其他东西嘲笑“交换”方法,而是更喜欢使用MockRestServiceServer
我正在使用spring-test-4.3.8.RELEASE版本
我们非常感谢代码片段:)
提前多多感谢
更新: 根据James的要求,我正在添加非工作测试片段(Spock测试):
MockRestServiceServer server = MockRestServiceServer.bindTo(restTemplate).build()
server.expect(once(), requestTo(getURI()))
.andExpect(method(HttpMethod.POST))
.andExpect(header(HttpHeaders.CONTENT_TYPE, startsWith("multipart/form-data;boundary=")))
.andExpect(content().formData(["someParam" : "SampleSomeParamValue", "file" : ???????] as MultiValueMap))
.andRespond(withSuccess("sample response", MediaType.APPLICATION_JSON))
multipartFile.getBytes() >> "samplefile".getBytes()
multipartFile.getOriginalFilename() >> "sample.txt"
我在断言请求内容时遇到异常。表单数据是不同的,因为实际表单数据是在内部使用Content-Disposition,Content-Type,Content-Length每个参数创建的,我不知道如何指定这些预期值
答案 0 :(得分:1)
在5.3版中,多部分请求期望已添加到MockRestServiceServer
中-请参阅:
您可以使用
将正文解析为多部分数据,并断言它完全包含给定MultiValueMap中的值。值的类型可能是:
- 字符串-表单字段
- 资源-文件中的内容
- byte []-其他原始内容
multipartData(MultiValueMap)的变体,其功能相同,但仅适用于一部分实际值。
答案 1 :(得分:0)
我认为这取决于您希望测试表单数据的程度。一种方法,不是100%完成,但对于单元测试(通常)来说“足够好”就是做一些事情:
server.expect(once(), requestTo(getURI()))
.andExpect(method(HttpMethod.POST))
.andExpect(content().string(StringContains.containsString('paramname=Value') ))....
这是丑陋和不完整的,但有时是有用的。当然,您也可以使表单设置自己的方法,然后使用模拟来验证预期的参数是否全部到位。