使用multipart请求测试MockRestServiceServer spring-test

时间:2017-05-23 08:05:58

标签: java spring multipartform-data spring-test

最近我开始使用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每个参数创建的,我不知道如何指定这些预期值

2 个答案:

答案 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') ))....

这是丑陋和不完整的,但有时是有用的。当然,您也可以使表单设置自己的方法,然后使用模拟来验证预期的参数是否全部到位。