如何使用 junit 使用 MultiPart 参数测试 REST API?

How to test REST API with MultiPart parameter using junit?

我需要一些帮助来测试 POST REST 功能,

我得到了这个 REST 函数头:

@RequestMapping(value = "/import", method = RequestMethod.POST)
    public @ResponseBody
    HistoricalDataImportResponse importHistoricalDataFile(String fileFormat, @RequestParam("file") MultipartFile stream)  {

我尝试使用 JUnit 测试它:

@Test
public void testHistoricalDataImport() throws Exception {
    ObjectMapper mapper = new ObjectMapper();
    FileItem fileItem = new DiskFileItem(null, null, false, null, 0, null);
    MultipartFile eventRequest = new CommonsMultipartFile(null);
    String body = mapper.writeValueAsString(eventRequest);

    //when
    MvcResult result = this.mockMvc.perform(post("/historicaldata/import").contentType(MediaType.MULTIPART_FORM_DATA).content(body))
            .andExpect(status().isOk())
            .andReturn();
}

测试 运行 时 fileItem 为空,我如何需要将一些文件传递给我的 REST 函数?

通过查看您的代码,您似乎想要从文件系统读取文件,然后使用 objectMapper 将其转换为 JSON。这是编写单元测试的不正确方式,您不从单元测试访问文件系统,您的测试应该 运行 隔离。使用下面的代码

  @Test
  public void testHistoricalDataImport() throws Exception {
    MockHttpServletRequestBuilder requestBuilder = MockMvcRequestBuilders.fileUpload("/historicaldata/import")
            .file("filename","some data as file text".getBytes());

    MvcResult result = mockMvc.perform(requestBuilder).andExpect(status().isOk()).andReturn();
  }

最终测试如下:

 @Test
    public void testHistoricalDataImport() throws Exception {
        MockMultipartFile firstFile = new MockMultipartFile("file", "filename.csv", "text/plain", "some CSV data".getBytes());
        MockHttpServletRequestBuilder requestBuilder = MockMvcRequestBuilders.fileUpload("/historicaldata/import")
                .file(firstFile);

        MvcResult result = mockMvc.perform(requestBuilder)
                .andExpect(status().isOk())
                .andReturn();
    }