Java &引用;当前请求不是多部分请求”;在不上载任何文件的情况下尝试使用MockMvc进行测试时
我想测试一个RequestMapping,它获取关于一个项目的一些信息,然后将其持久化,它还允许上传图像。但是,图像上传不是强制性的,我的HTML表单正在使用:Java &引用;当前请求不是多部分请求”;在不上载任何文件的情况下尝试使用MockMvc进行测试时,java,spring,http,junit,mockmvc,Java,Spring,Http,Junit,Mockmvc,我想测试一个RequestMapping,它获取关于一个项目的一些信息,然后将其持久化,它还允许上传图像。但是,图像上传不是强制性的,我的HTML表单正在使用:enctype=“multipart/form data”。我尝试在不实际上传任何文件的情况下测试控制器,控制器如下所示: @RequestMapping(value=“/admin/upload”,method=RequestMethod.POST) 公共模型和视图附加项( @RequestParam(value=“id”,requir
enctype=“multipart/form data”
。我尝试在不实际上传任何文件的情况下测试控制器,控制器如下所示:
@RequestMapping(value=“/admin/upload”,method=RequestMethod.POST)
公共模型和视图附加项(
@RequestParam(value=“id”,required=true)整数id,
@RequestParam(value=“name”,required=true)字符串名称,
@RequestParam(value=“image”,required=false)多部分文件,
)抛出IOException{
//这里有些东西
ModelAndView mov=新ModelAndView();
返回mov;
}
尽管我已经将required
标志设置为false
,但更重要的是,是否可以在mockMvc请求中发送头文件,从而允许我在不需要上传任何图像的情况下测试此映射
mockMvc.perform(post(“https://localhost/store-admin/items/itemAddSubmit")
.param(“id”,1)
.param(“名称”、“测试名称”)。带有(csrf())
.andDo(print());
对于多部分请求,您需要使用fileUpload
方法,而不是get
、post
或其他任何方法
按如下方式更新您的代码-
mockMvc.perform(fileUpload("https://localhost/store-admin/items/itemAddSubmit")
.param("id", 1)
.param("name", "testname").with(csrf()))
.andDo(print());
要实际发送文件,请使用file
功能和fileUpload
,如下所示-
mockMvc.perform(fileUpload("https://localhost/store-admin/items/itemAddSubmit")
.file(myMockMultipartFile)
.param("id", 1)
.param("name", "testname").with(csrf()))
.andDo(print());
其中,
myMockMultipartFile
是一个MockMultipartFile
对象。需要注意的一点非常重要-如果在REST端点上接受文件的[@RequestParam
没有设置“值=
”属性,则在运行模拟测试时也会抛出相同类型的错误。在prod中运行解决方案时,您可以忽略“value”属性,并且不会遇到任何错误,但是这样做会阻止您以编程方式运行测试和注入文件
例:
你的问题已经很好地说明了这一点,但我想为将来的用户记录这个答案,他们可能会像我一样忽略这样一个小细节
干杯谢谢,这很有效。我没有意识到有一个
fileUpload
请求类型。不幸的是,当使用完全相同的格式时,我仍然得到一个错误-声明参数不存在(在他的情况下是“file”)。有没有什么我说得不对的地方?扩大你的答案会很有帮助。谢谢。@degreesightdc您确定要传递所有参数吗?如果你开始自己的问题时有错误跟踪和其他相关细节,那就更好了。
@RequestParam(value="file") final MultipartFile file,