在Spring的集成测试过程中MultipartFile#getContentType返回null

时间:2019-05-13 17:34:37

标签: java spring integration-testing spring-test

我有以下文件:

ImageForm.java:

public class ImageForm {
  @FileNotEmpty
  private MultipartFile file;
  // other code ...
}

GalleryController.java:

@Controller
@RequestMapping("/admin/galleries")
public class GalleryController {
@PostMapping("/{id}/image/create")
  public ModelAndView createImage(@PathVariable("id") long galleryId, @Valid ImageForm imageForm, BindingResult bindingResult, RedirectAttributes redirectAttributes) {
    // other code ...
    System.out.println(imageForm.getFile().getContentType()); // Prints: null
    // other code ...
  }
}

GalleryControllerIT.java:

@SqlGroup({
     @Sql("classpath:test-schema.sql"),
     @Sql("classpath:test-gallery-data.sql"),
     @Sql("classpath:test-image-data.sql")
})
public class GalleryControllerIT extends SetupControllerIT {
    @Test
    public void createImage_POSTHttpMethod_ImageIsCreated() throws Exception {
        Path path = Paths.get(getClass().getClassLoader().getResource("test-image.png").toURI());
        byte[] image = Files.readAllBytes(path);

        mvc.perform(
            multipart("/admin/galleries/1/image/create")
                .file("file", image) // TODO: ImageForm.file.contentType is null.
                .with(csrf())
        ).andExpect(status().isFound());

        assertThat(imageRepository.count(), is(5L));
    }
}
  1. 正在测试GallerControllerIT#createImage_POSTHttpMethod_ImageIsCreated 我设置了一个文件。
  2. 测试将文件发送到GalleryController#createImage并映射 到ImageForm#file属性。
  3. ImageForm#file的类型为MultipartFile,其类型为getContentType
  4. 方法MultipartFile#getContentType返回null

问题是,为什么MultipartFile#getContentType返回null?在测试之外,它可以正常工作。

1 个答案:

答案 0 :(得分:1)

有关完整数据,请致电

.file(new MockMultipartFile("image", "some_name", MediaType.MULTIPART_FORM_DATA_VALUE, image))

因为在您的情况下,如果您调用.file("file", image),他们将调用构造函数MockMultipartFile的简短版本,而没有内容类型

MockMvc尝试不创建或声明一些其他值或参数(如果未声明它们的话)。