Mockmvc用于接受Multipart文件的DELETE方法

时间:2019-01-10 13:58:29

标签: java spring-boot mockmvc

我正在尝试为具有 DELETE 方法的控制器编写单元测试,该方法应该接受File和text param。

我知道我可以做一个简单的删除:

    MvcResult result = mockMvc.perform(MockMvcRequestBuilders.delete(
            "/deletecat/catname/Oscar"))
            .andExpect(status().isOK)
            .andReturn();

我可以对这样的Multipart文件执行POST:

MockMultipartFile multipartFile = new MockMultipartFile("file", new FileInputStream(TEST_RESOURCES_FOLDER + "Cats.csv"));
MvcResult result = mockMvc.perform(MockMvcRequestBuilders.multipart("/uploadcats")
   .file(multipartFile)
   .param("ownerName", "Austin Powers"))
   .andExpect(status().isOk())
   .andReturn();

但是当我试图将它们组合在一起并写成这样时:

 MvcResult result = mockMvc.perform(
            MockMvcRequestBuilders.delete(
                    "/deletecats", 
                    multipartFile, "Austin Powers"))
            .andExpect(status().isOk())
            .andReturn();

我收到以下错误:“当前请求不是多部分请求”

org.springframework.web.util.NestedServletException: Request processing failed; nested exception is org.springframework.web.multipart.MultipartException: Current request is not a multipart request

HTTP协议是否可能不支持对Multipart文件执行DELETE?

2 个答案:

答案 0 :(得分:0)

似乎MockMultipartHttpServletRequestBuilder仅支持POST请求,该常量表示HTTP方法is hard-coded in the constructors。这很奇怪,因为至少POSTPUT通常与多部分一起使用。

恐怕在当前版本中,您将不得不派生该类并自行更改HTTP方法。

答案 1 :(得分:0)

我个人会说从API设计角度来看这是错误的。

REST正在大量使用资源,因此正在使用它们的专用标识符,例如

获取/ entities以获取实体列表 获取/ entities / {entity-id}以获取单个实体

我将申请删除的相同模式:按标识符处理资源。