我正在为一个控制器方法编写一个单元测试,该方法接受一个MultipartFile
和一个自定义对象MessageAttachment
。到目前为止,我可以看到MultipartFile是请求的正确格式,但MessageAttachment不是。
通过解析MessageAttture
,会抛出服务器端500错误,其中包含METHOARGumentConversionNotSup的dExc0019
。
这似乎是一个问题,在测试中转换到MockMultipartFile消息附件。这类似于这里显示的示例-https://stackoverflow.com/a/21805186
问题:
如何使用MockMvc解决一个方法ArgumentConversionNotSupport dExcture?
被测控制器方法
@RequestMapping(value = "/", method = RequestMethod.POST, consumes = "multipart/form-data", produces = "application/json")
public ResponseEntity<MessageAttachment> handleFileUpload(@RequestParam(value = "file", required = true) MultipartFile file, @RequestParam(value = "messageAttachment") MessageAttachment messageAttachment) {
//do stuff with the file and attachment passed in..
MessageAttachment attachment = new MessageAttachment();
return ResponseEntity.accepted().header(HttpHeaders.CONTENT_DISPOSITION,
"attachment; filename=\"" + file.getOriginalFilename() + "\"").body(attachment);
}
模拟MVC测试
@Test
public void shouldSaveUploadedFile() throws Exception {
// Given
ObjectMapper mapper = new ObjectMapper();
MessageAttachment messageAttachment = new MessageAttachment();
messageAttachment.setTimestamp(new Date());
MockMultipartFile multipartFile = new MockMultipartFile("file", "test.txt", "text/plain",
"Spring Framework".getBytes());
//Mapping the msgAttachment to a MockMultipartFile HERE
MockMultipartFile msgAttachment = new MockMultipartFile("messageAttachment", "","application/json",
mapper.writeValueAsString(messageAttachment).getBytes());
// When
this.mockMvc.perform(MockMvcRequestBuilders.multipart("/media/")
.file(multipartFile)
.file(msgAttachment)).andDo(MockMvcResultHandlers.print());
}
MockMVCresultHandler的控制台输出。打印()
MockHttpServletRequest:
HTTP Method = POST
Request URI = /media/
Parameters = {}
Headers = {Content-Type=[multipart/form-data]}
Body = <no character encoding set>
Session Attrs = {}
Handler:
Type = com.fizz.buzz.fizzapi.controller.MediaUploadController
Method = public org.springframework.http.ResponseEntity<com.fizz.buzz.fizzapi.model.MessageAttachment> com.fizz.buzz.fizzapi.controller.MediaUploadController.handleFileUpload(org.springframework.web.multipart.Mu
ltipartFile,com.fizz.buzz.fizzapi.model.MessageAttachment,javax.servlet.http.HttpServletRequest)
Async:
Async started = false
Async result = null
Resolved Exception:
Type = org.springframework.web.method.annotation.MethodArgumentConversionNotSupportedException
ModelAndView:
View name = null
View = null
Model = null
对于请求的application/json
部分,您需要使用@RequestPart
而不是@RequestParam
。@RequestPart
的javadoc声明
支持的方法参数类型包括MultipartFile
和Spring的MultipartResolver
抽象、javax。servlet。http。部分
与Servlet 3.0多部分请求结合使用,或者对于任何其他方法参数,考虑到请求部分的“内容类型”头,部分内容通过HttpMessageConverter
传递。这类似于@RequestBody
根据非多部分常规请求的内容解析参数。
请注意,@RequestParam
注释还可用于将“多部分/表单数据”请求的一部分与支持相同方法参数类型的方法参数相关联。主要区别在于,当方法参数不是字符串时,@RequestParam
依赖于通过注册的转换器或
属性编辑器进行的类型转换,
@RequestPart
依赖于HttpMessageConverters
,同时考虑到请求部分的“内容类型”头@RequestParam
可能用于名称值表单字段,而@RequestPart
可能用于包含更复杂内容的部分(例如JSON、XML)。
假设您没有注册
转换器
,也没有注册属性编辑器
,来解析该部分的内容,而如果类路径上有Jackson,JSON的HttpMessageConverter
会自动注册(取决于您的Spring MVC/引导版本)。
我有一个基本的SpringMVC应用程序,运行(和映射)很好。现在我想用MockMvc设置我的单元测试来执行get请求和其他东西。但如果我运行测试,则会出现断言错误状态: 以下是我的短期测试课程: 所以我希望MockMvc在默认情况下获得DispatcherServlet的位置。但它实际上并不是用来映射的。 我的“web.xml”和“dispatcher servlet.xml”位于“web-IN
我读过其他的解决方案,其中提到创建一个模拟类/对象,我相信我已经用“booksearch mockBookSearch=mockito.mock(booksearch.class);” 我错过了什么?
但是,测试最终出现错误: OBJC[77723]:类JavaLaunchHelper在/library/java/javaVirtualMachines/jdk1.7.0_80.jdk/contents/home/bin/java(0x10bc614c0)和/library/java/javaVirtualMachines/jdk1.7.0_80.jdk/contents/home/jre/lib
问题内容: 我只是写一个小的Ajax框架来实现小项目的可重用性,但是我遇到了一个问题。基本上,我在发送请求时收到’ ‘错误,我不知道发生了什么。 HTML页面(已修剪但显示错误) PHP文件: 完整错误: 我只是看不到哪里出了问题,有什么想法吗? 问题答案: 异常“组件返回的故障代码:0x80070057(NS_ERROR_ILLEGAL_VALUE)”是由于将非法值传递到open方法的调用中引起
Values.java AmountDetail.java 当我在postman if子句中点击API时,它工作正常,但如果我想检查else,它会给出错误。我觉得铸造是这里的问题,但我不知道如何返回else块的值。
我正在尝试用Java解决一个ODE,到目前为止,我已经尝试了两个不同的库。我最信任的是Apache Commons Math,然而,即使是简单的问题,我似乎也得不到正确的解。 当我在Mathematica中求解系统时,我得到了这样的结果: 如果我用Apache Commons Math中的Dormand-Prince8(5,3)求解器求解,我会得到以下结果: