Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/372.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java &引用;当前请求不是多部分请求”;在不上载任何文件的情况下尝试使用MockMvc进行测试时_Java_Spring_Http_Junit_Mockmvc - Fatal编程技术网

Java &引用;当前请求不是多部分请求”;在不上载任何文件的情况下尝试使用MockMvc进行测试时

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

我想测试一个RequestMapping,它获取关于一个项目的一些信息,然后将其持久化,它还允许上传图像。但是,图像上传不是强制性的,我的HTML表单正在使用:
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,