无法使用Spring Boot Test测试MockMultipartFile - 未找到序列化程序

时间:2017-10-11 16:05:59

标签: java spring spring-boot

我正在尝试模拟将图像上传到控制器端点,该端点期望DTO包含MultipartFile输入以及几个纯文本字段。但我似乎无法模拟MultipartFile发送:

这是我的测试:

 @Test
  public void saveAnEntryWhenPOSTNewUserWithAPicture() throws Exception {
    MockMultipartFile multiPFImage = new MockMultipartFile("contactImgUpload", "abcpic.png",
            "text/plain", "Generate bytes to simulate a picture".getBytes());
    mockMvc.perform(MockMvcRequestBuilders.fileUpload("/newContact")
            .file(multiPFImage)
            .contentType(MediaType.MULTIPART_FORM_DATA)
            .param("userId", "12345")
            .param("name", "Picture Uploader User"))
            .andExpect(status().isOk())
            .andExpect(content().string(containsString("Picture Uploader User")))
            .andExpect(content().string(containsString("Replace with image title")));
  }

我们正在测试的控制器方法:

@PostMapping(path = "/newContact")
  public @ResponseBody ContactDTO createNewContact(@ModelAttribute ContactDTO newContact) {

   //converts newContact to DAO and persists to DB

   return newContact
}

转换的 DTO

public class ContactDTO implements Serializable {

  private BigInteger userId;
  private BigInteger contactId; //automatically generated on persistence
  private String name;
  private MultipartFile contactImgUpload;
}

当我运行测试时,它失败了,我收到了这条消息:

  

.w.s.m.s.DefaultHandlerExceptionResolver:无法写入HTTP   信息:   org.springframework.http.converter.HttpMessageNotWritableException:   无法编写JSON:没有为类找到序列化程序   java.io.ByteArrayInputStream并未发现要创建的属性   BeanSerializer(避免异常,禁用   SerializationFeature.FAIL_ON_EMPTY_BEANS);嵌套异常是   com.fasterxml.jackson.databind.JsonMappingException:没有序列化程序   找到类java.io.ByteArrayInputStream,没有属性   发现创建BeanSerializer(以避免异常,禁用   SerializationFeature.FAIL_ON_EMPTY_BEANS)(通过参考链:   app.models.dto.ContactDTO [ “contactImgUpload”] - > org.springframework.mock.web.MockMultipartFile [ “的inputStream”])

我已经看过这个问题的其他几个例子,但大多数没有答案,或者不完全相同。关于如何测试需要绑定到DTO的MockMultipartFile的任何想法?

1 个答案:

答案 0 :(得分:2)

您可以使用:

@Autowired
private ObjectMapper mapper;

@Before
public void before() {
    mapper.disable(SerializationFeature.FAIL_ON_EMPTY_BEANS);
}