mockito 在Spring启动中测试Multipartfile由于MockMultipartFile而导致的空指针异常

qeeaahzv  于 2022-11-08  发布在  Spring
关注(0)|答案(1)|浏览(327)

我有一个控制器,它接受一个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启动,并不知道如何这将不得不解决。

ddhy6vgd

ddhy6vgd1#

查看单元测试片段,服务类和它的行为没有被模仿。这应该导致NPE。如果不是这样,你能共享堆栈跟踪吗?无法找出导致NPE的原因。
这里是如何模拟Mvc控制器的an example
This one执行多部件

相关问题