MultipartFile # getContentType возвращает ноль во время интеграционных тестов в Spring - PullRequest
0 голосов
/ 13 мая 2019

У меня есть следующие файлы:

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 возвращает ноль?Он работает правильно, когда за пределами теста.

1 Ответ

1 голос
/ 14 мая 2019

Для полных данных вы должны позвонить

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

Потому что в вашем случае, если вы звоните .file("file", image), они вызывают короткую версию конструктора MockMultipartFile без типа контента

MockMvc пытаясь не создавать или объявлять некоторые дополнительные значения или параметры, если вы не объявляете их.

...