无法测试CSV上传java spring的控制器



我有一个在post请求中上传csv的工作控制器。邮差状态200,测试状态400。我正在努力找出问题所在。

控制器:

@RestController
@RequestMapping("/csv")
public class CsvController {
final CsvService csvService;
public CsvController(CsvService csvService) {
this.csvService = csvService;
}
@PostMapping("/upload")
public ResponseEntity<Response> uploadFile(@RequestParam("file")MultipartFile file) {
if(CsvHelper.hasCSVFormat(file)) {
Response response = csvService.save(file);
return new ResponseEntity<>(response, HttpStatus.valueOf(response.getStatus()));
}
Response response = new Response().setStatus(400).setMessage("Please upload a CSV file");
return new ResponseEntity<>(response, HttpStatus.valueOf(response.getStatus()));
}
}

CsvHelper Util:

public class CsvHelper {
public static String TYPE = "text/csv";
public static boolean hasCSVFormat(MultipartFile file) {
return TYPE.equals(file.getContentType());
}
}

测试:

@ExtendWith(SpringExtension.class)
@WebMvcTest(value = CsvController.class)
public class TestControllerTest {
@Autowired
private MockMvc mockMvc;
@MockBean
private CsvService csvService;
@Test
void status200WhenUploadingCSV() throws Exception {
MockMultipartFile mockMultipartFile = new MockMultipartFile(
"multipartFile",
"template.csv",
"text/csv",
new ClassPathResource("template.csv").getInputStream());
mockMvc.perform(MockMvcRequestBuilders.multipart("/csv/upload")
.file(mockMultipartFile))
.andExpect(status().isOk());
}}

当测试失败时,我可以看到这个已解决的异常:Type = org.springframework.web.multipart.support.MissingServletRequestPartException

此错误是由于您上传的文件大小。可以通过设置最大上传大小来修复。

把它添加到你的主类中。

@Bean(name = "multipartResolver")
public CommonsMultipartResolver multipartResolver() {
CommonsMultipartResolver multipartResolver = new CommonsMultipartResolver();
multipartResolver.setMaxUploadSize(10000000L);
return new CommonsMultipartResolver();
}

@RequestParam("file")MultipartFile file/file为空或未接收任何属性时,有时会发生此异常。你可以在这里看到。也许它能解决你的问题。或者您可以在application.properties文件中指定您的文件大小:

spring.http.multipart.max-file-size=10MB
spring.http.multipart.max-request-size=11MB