我有一个控制器,它接受一个csv文件并从文件中读取信息。控制器将信息传递到服务层以提取所需的数据。
我所面临的问题是,当我用postman上传一个文件时,我没有遇到任何问题。信息是从文件中读取的,一切都很好。但是当我测试它时,我遇到了NullPointerException。我必须准备一个测试用例,在那里整个控制器都必须被测试,但是我被困在NullPointerException处。我不确定,但我认为这是由于MockMultipartFile。
该控制器
@PostMapping("/validate-csv-file")
public Flux<FormInstanceDTO> validateCsvFile(@RequestParam("file") MultipartFile file)
throws Exception {
if (file.isEmpty()) {
return null;
}
String headerLine = fileValidationService.readHeaderOfFile(file); //***NULLPOINTERREXCEPTION***
//this line passes information to service where i read the columns headers
// above line is where test fails due to Nullpointerexception using MockMultipartFile.
// But when I upload a csv file using postman, there is no error and the string headerline holds data
String[] headerColumns = headerLine.split(",");
String csvContent = fileValidationService.prepareDownloadCsvFile(file);
Reader reader = new BufferedReader(new InputStreamReader(file.getInputStream(), StandardCharsets.UTF_8));
CsvToBean<ReferralCSV> csvToBean =
new CsvToBeanBuilder(reader)
.withType(ReferralCSV.class)
.withIgnoreLeadingWhiteSpace(true)
.build();
List<ReferralCSV> referalCSVList = csvToBean.parse();
Boolean passValidation = fileValidationService.validateReferral(referalCSVList);
if (passValidation) {
ReferralHeaderMetaData headerMetaData =
fileValidationService.createHeaderMetaData(headerColumns);
String clientCode = "123";
FileValidationDTO dto = formService.getLatestFileValidationDTO(referralFormId, clientCode);
// dto.setHeaderMetaData(headerMetaData.toString());
dto.setCsvContent(csvContent);
Flux<FormInstanceDTO> formInstanceDTOFlux =
formService.createFormInstance(referralFormId, dto);
return formInstanceDTOFlux;
}
return null;
}
和测试,
@Test
void status200WhenUploadingCSV() throws Exception {
String path = String.valueOf(new ClassPathResource("referral-test.csv").getInputStream());
ClassLoader classLoader = this.getClass().getClassLoader();
File file = new File(classLoader.getResource("referral-test.csv").getFile());
MockMultipartFile mockMultipartFile =
new MockMultipartFile(
"file",
"referral-test.csv",
"text/csv",
new ClassPathResource("referral-test.csv").getInputStream());
mockMvc
.perform(MockMvcRequestBuilders.multipart("/rev/api/debt/v1/validate-csv-file/referral").file(mockMultipartFile))
.andExpect(status().isOk());
}
我没有专业知识,在测试和Spring启动,并不知道如何这将不得不解决。
1条答案
按热度按时间ddhy6vgd1#
查看单元测试片段,服务类和它的行为没有被模仿。这应该导致NPE。如果不是这样,你能共享堆栈跟踪吗?无法找出导致NPE的原因。
这里是如何模拟Mvc控制器的an example
This one执行多部件