当前位置: 首页 > 知识库问答 >
问题:

通过上载一些文件来测试Spring多部分/表单数据控制器

邹麻雀
2023-03-14

我正在尝试测试此控制器:

@RequestMapping(value="/u",consumes="multipart/form-data", method = RequestMethod.POST)
public @ResponseBody String register(
    @RequestParam String u,
    @RequestParam CommonsMultipartFile filea,
    @RequestParam CommonsMultipartFile fileb,
    @RequestParam CommonsMultipartFile filec,
    @RequestParam CommonsMultipartFile filed) {

    return "hi";
}

使用此模拟请求:

mockMvc.perform(
    MockMvcRequestBuilders.fileUpload("/u")
        .file("filea","id.jpg".getBytes())
        .file("fileb","pc.jpg".getBytes())
        .file("filec","cl.jpg".getBytes())
        .file("filed","fo.jpg".getBytes())
        .param("u", u))
        .andExpect(MockMvcResultMatchers.status().isOk())
        .andDo(MockMvcResultHandlers.print());

虽然,我猜我写MockMvcRequest错误,因为测试失败(返回的状态是500)。

提前感谢。

共有2个答案

卫飞
2023-03-14

如何测试多部分上传的简单方法是使用Standard ardServletMultipartResolver。并使用以下代码进行测试:

    final MockPart profilePicture = new MockPart("profilePicture", "stview.jpg", "image/gif", "dsdsdsd".getBytes());
    final MockPart userData = new MockPart("userData", "userData", "application/json", "{\"name\":\"test aida\"}".getBytes());

    this.mockMvc.perform(
            fileUpload("/endUsers/" + usr.getId().toString()).with(new RequestPostProcessor() {

                @Override
                public MockHttpServletRequest postProcessRequest(MockHttpServletRequest request) {
                    request.addPart(profilePicture);
                    request.addPart(userData);
                    return request;
                }
            }) 

MockPart类

public class MockPart extends MockMultipartFile implements Part {

private Map<String, String> headers;

public MockPart(String name, byte[] content) {
    super(name, content);
    init();
}

public MockPart(String name, InputStream contentStream) throws IOException {
    super(name, contentStream);
    init();
}

public MockPart(String name, String originalFilename, String contentType, byte[] content) {
    super(name, originalFilename, contentType, content);
    init();
}

public MockPart(String name, String originalFilename, String contentType, InputStream contentStream) throws IOException {
    super(name, originalFilename, contentType, contentStream);
    init();
}

public void init() {
    this.headers = new HashMap<String, String>();
    if (getOriginalFilename() != null) {
        this.headers.put("Content-Disposition".toLowerCase(), "form-data; name=\"" + getName() + "\"; filename=\"" + getOriginalFilename() + "\"");
    } else {
        this.headers.put("Content-Disposition".toLowerCase(), "form-data; name=\"" + getName() + "\"");
    }
    if (getContentType() != null) {
        this.headers.put("Content-Type".toLowerCase(), getContentType());
    }
}

@Override
public void write(String fileName) throws IOException {
}

@Override
public void delete() throws IOException {
}

@Override
public String getHeader(String name) {
    return this.headers.get(name.toLowerCase());
}

@Override
public Collection<String> getHeaders(String name) {
    List<String> res = new ArrayList<String>();
    if (getHeader(name) != null) {
        res.add(getHeader(name));
    }
    return res;
}

@Override
public Collection<String> getHeaderNames() {
    return this.headers.keySet();
}

}

商风华
2023-03-14

这个问题很小-只需将您的CommonsMultipartFile更改为MultipartFile,您的测试就可以干净地运行了。

出现此问题的原因是,创建的模拟文件上载参数是一个MockMultipartFile,不能转换为更具体的CommonMultipartFile类型。

 类似资料:
  • 是否可以使用数据上传包含其他数据(如描述等)的文件?我正在使用骨干.js在我的前端,我用它调用REST API(jQuery)。我不使用任何视图解析器,但我想以某种方式将我的文件传递给控制器,如下所示: 以便uploadItem存储: 但是我不会(也不能)把这个加到我的模型里。 当然,我也很感兴趣是否有可能有这样的控制器:

  • 无论我怎么努力,似乎都无法解决这个问题。我正在提交此curl命令: 我有一个带有注释@RestController的Spring Boot 1.4应用程序,方法如下: filedata变量始终为null,请求对象始终显示0个文件。 我已经尝试了MultipartResolver的多种配置。这是我的最新消息: 我也在我的应用程序中手动粘贴了这些。属性,以确保其未被禁用: Springhttp。多部分

  • 我使用Spring引导上传文件。文件大小通常约为2GB,我们不能使用默认的Spring引导或,因为服务器具有有限的资源(磁盘空间)或用于缓冲的内存。所以我们想获取文件输入蒸汽并将文件直接存储到云存储中。 我知道spring boot有<code>多部分。已启用属性,因此我可以将其设置为false以跳过spring。但这会全局禁用多部分。是否有人知道是否有方法通过控制器/方法禁用多部分?

  • 我无法编写将文件上载到控制器的测试。 在这一问题发生的所有事件中,我没有看到任何事情对我有效。 我可以从我的webapp上传和存储文件,但是当我运行测试时,控制器中的文件总是空的 应用程序 控制器 测验

  • 我正在尝试在 Java 应用程序中设置一个 Apache Camel 路由,其中使用者终结点是一个 restlet 组件,它将 HTTP 文件上传作为多部分表单数据的 POST 进行处理,然后创建者终结点将请求转发到也接受多部分表单数据的 rest 服务。我是骆驼的新手,不知道如何正确地连接它。以下是到目前为止我的路线。我是否需要对正文进行任何转换,还是会按原样转发多部分表单数据?有人可以为我提供

  • 我正在尝试使用Support Bee API创建附件,如下所述:https://supportbee.com/api#create_attachment 我编写了一个服务,它使用创建并发送使用文件名的请求。 如果我在《邮递员》中测试,它会成功。我正在为正文使用,只是从UI中选择要上载的文件: 当我试图通过我的服务上传它时,它不起作用: 这将导致500内部服务器错误。检查对象时,我可以看到它的标题值