Java 使用多部分请求测试MockRestServiceServer spring测试

Java 使用多部分请求测试MockRestServiceServer spring测试,java,spring,multipartform-data,spring-test,Java,Spring,Multipartform Data,Spring Test,最近,我开始使用Spring的MockRestServiceServer在测试中验证基于RestTemplate的请求 当它用于简单的get/post请求时——都很好,但是,我不知道如何将它用于post多部分请求: 例如,我要测试的工作代码如下所示: public ResponseEntity<String> doSomething(String someParam, MultipartFile file, HttpHeaders headers) { //I add hea

最近,我开始使用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);
}

我在断言请求内容时遇到异常。表单数据是不同的,因为实际的表单数据是在内部创建的,每个参数具有内容配置、内容类型、内容长度,我不知道如何指定这些期望值,我认为这取决于您希望测试表单数据的深度。一种不是100%完成,但对于单元测试来说“足够好”的方法(通常)是执行以下操作:

server.expect(once(), requestTo(getURI()))
       .andExpect(method(HttpMethod.POST))
        .andExpect(content().string(StringContains.containsString('paramname=Value') ))....

这是丑陋和不完整的,但有时是有用的。当然,您也可以将表单设置作为自己的方法,然后使用mock尝试验证预期参数是否都已就位。

多部分请求预期已在Spring 5.3中添加到
MockRestServiceServer
-请参阅:

你可以用

将主体解析为多部分数据,并断言它完全包含给定多值映射中的值。值可以是以下类型:

  • 字符串形式字段
  • 资源-文件中的内容
  • 字节[]-其他原始内容
multipartData(MultiValueMap)的变体,其功能相同,但仅适用于实际值的子集


您可以添加测试后代码段吗?谢谢您的评论,指定期望值的非工作性尝试在这方面是很幸运的?我正在尝试做一些类似的事情,并且面临一些问题。不幸的是,没有。看起来这种模拟技术只适合指导“REST”操作。多部分声音“超越”了这些简单操作的集合。我已经放弃这个了
server.expect(once(), requestTo(getURI()))
       .andExpect(method(HttpMethod.POST))
        .andExpect(content().string(StringContains.containsString('paramname=Value') ))....