【发布时间】:2021-12-03 05:58:57
【问题描述】:
在我们的 Spring Boot 应用程序中,我们从请求中获取了一个多部分形式的数据文件,如下所示:
ServletFileUpload upload = new ServletFileUpload();
try {
FileItemIterator iterStream = upload.getItemIterator(request);
while (iterStream.hasNext()) {
FileItemStream item = iterStream.next();
if (item.getFieldName().equals("file")) {
return upload(
item.getName(),
item.getContentType(),
item.openStream()
);
}
}
现在我正在编写一个用于下载文件的集成测试。我使用mockMvc 发送请求。我尝试了很多不同的选择:
File dataFile = resourceLoader.getResource("classpath:data/fakeload/test.pdf").getFile();
MockMultipartFile file = new MockMultipartFile("test", "test.pdf",MediaType.APPLICATION_PDF_VALUE, FileUtils.readFileToByteArray(dataFile));
mockMvc.perform(multipart("/api/project-others/documents")/*.file("test.pdf",FileUtils.readFileToByteArray(dataFile))*/.file(file)
.with(getAuthentication("AUTH"))
.contentType(MediaType.MULTIPART_FORM_DATA_VALUE+";boundary=----WebKitFormBoundarylRihI4R4f6S5eHA2")
.requestAttr("file",FileUtils.readFileToByteArray(dataFile))
//.content(createFileContent(FileUtils.readFileToByteArray(dataFile),"WebKitFormBoundarylRihI4R4f6S5eHA2",MediaType.APPLICATION_PDF_VALUE,"test.pdf"))
.content(file.getBytes())
.param("projectId","1")
.param("docId","1")
)
.andExpect(status().isOk())
.andDo(print());
}
private byte[] createFileContent(byte[] data, String boundary, String contentType, String fileName){
String start = "--" + boundary + "\r\n Content-Disposition: form-data; name=\"file\"; filename=\""+fileName+"\"\r\n"
+ "Content-type: "+contentType+"\r\n\r\n";;
String end = "\r\n--" + boundary + "--"; // correction suggested @butfly
return ArrayUtils.addAll(start.getBytes(),ArrayUtils.addAll(data,end.getBytes()));
}
但iterStream.hasNext() 始终为false(iterStream 为空)。我错过了什么?怎么了?
【问题讨论】:
-
它总是假的还是只在你的测试期间?
-
您在代码中的哪个位置使用
ServletFileUpload? -
Tacolibre,仅在测试时为假,如果通过前端与服务器交互,一切正常。
-
Harry Coder,我得到
iterStream,通过请求,使用ServletFileUpload
标签: java integration-testing spring-test