"The current request is not a multipart request" 在不上传任何文件的情况下尝试使用 MockMvc 进行测试时

"The current request is not a multipart request" when trying to test with MockMvc without uploading any file

我想测试一个 RequestMapping,它获取有关项目的一些信息然后保存它,它还允许上传图像。但是,图片上传不是强制性的,我的 HTML 表单使用的是:enctype="multipart/form-data"。我正在尝试在不实际上传任何文件的情况下测试控制器,控制器看起来像这样:

@RequestMapping(value="/admin/upload", method=RequestMethod.POST)
public ModelAndView addItem(
        @RequestParam(value="id", required=true) Integer id,
        @RequestParam(value="name", required=true) String name,
        @RequestParam(value="image", required=false) MultipartFile file,
        ) throws IOException {

    // some stuff here

    ModelAndView mov = new ModelAndView();
    return mov;

}

尽管我已经将 required 标志设置为 false,但我遇到了缺少参数的问题,但更重要的是,是否可以将 headers 发送到允许我在不需要上传任何图像的情况下测试此映射的 mockMvc 请求?

    mockMvc.perform(post("https://localhost/store-admin/items/itemAddSubmit")
            .param("id", 1)
            .param("name", "testname").with(csrf()))
            .andDo(print());

对于多部分请求,您需要使用 fileUpload 方法而不是 getpost 或其他方法。

按如下方式更新您的代码 -

mockMvc.perform(fileUpload("https://localhost/store-admin/items/itemAddSubmit")
            .param("id", 1)
            .param("name", "testname").with(csrf()))
            .andDo(print());

要实际发送文件,请使用带有 fileUploadfile 函数,如下所示 -

mockMvc.perform(fileUpload("https://localhost/store-admin/items/itemAddSubmit")
            .file(myMockMultipartFile)
            .param("id", 1)
            .param("name", "testname").with(csrf()))
            .andDo(print());

其中 myMockMultipartFile 是一个 MockMultipartFile 对象。

非常需要注意 - 如果在您的 REST 端点上接受 file] 的 [@RequestParam 没有“value=”属性设置,它也会在 运行 模拟测试时抛出相同类型的错误。当 运行 prod 中的解决方案并且没有遇到任何错误时,您可以忽略 "value" 属性,但这样做会阻止您 运行 测试并以编程方式注入文件。

例如:

@RequestParam(value="file") final MultipartFile file,

你的问题已经正确地显示了这一点,但我想为将来可能像我一样忽略这样一个小细节的用户记录这个答案。

干杯