2016-07-25 216 views
5

我有控制器與PUT方法,它接收的multipart/form-data的方法:如何使用Spring MockMvc處理多部分/表單數據?

@RequestMapping(value = "/putIn", method = RequestMethod.PUT) 
    public Foo updateFoo(HttpServletRequest request, 
          @RequestBody Foo foo, 
          @RequestParam("foo_icon") MultipartFile file) { 
    ... 
    } 

和我想用MockMvc對它進行測試。不幸的是MockMvcRequestBuilders.fileUpload創建的MockMultipartHttpServletRequestBuilder基本實例,它具有POST方法:

super(HttpMethod.POST, urlTemplate, urlVariables) 

編輯: 我一定能 我不能創建自己的實施MockHttpServletRequestBuilder,說

public MockPutMultipartHttpServletRequestBuilder(String urlTemplate, Object... urlVariables) { 
    super(HttpMethod.PUT, urlTemplate, urlVariables); 
    super.contentType(MediaType.MULTIPART_FORM_DATA); 
} 

因爲MockHttpServletRequestBuilder具有包本地構造函數。

但我想知道更方便 有沒有辦法做到這一點,可能是我錯過了一些現有的類或方法做到這一點?

+0

您能否將我的答案標記爲已接受的答案?這將有助於保持StackOverflow的清潔和高效。謝謝! – HammerNL

+1

完成=======> – Andremoniy

回答

18

是的,有一種方法,它也很簡單!

我自己遇到了同樣的問題。雖然我對Sam Brannen的回答感到沮喪,但現在Spring MVC似乎支持PUT文件上傳,因爲我可以簡單地使用Postman(我使用Spring Boot 1.4.2)做這樣的請求。所以,我一直在挖掘,發現唯一的問題是MockMvcRequestBuilders.fileUpload()返回的MockMultipartHttpServletRequestBuilder將該方法硬編碼爲「POST」。然後我發現了with()方法...

和,讓我想出這個整潔的小把戲,迫使MockMultipartHttpServletRequestBuilder反正使用「PUT」方法:

MockMultipartFile file = new MockMultipartFile("data", "dummy.csv", 
      "text/plain", "Some dataset...".getBytes()); 

    MockMultipartHttpServletRequestBuilder builder = 
      MockMvcRequestBuilders.fileUpload("/test1/datasets/set1"); 
    builder.with(new RequestPostProcessor() { 
     @Override 
     public MockHttpServletRequest postProcessRequest(MockHttpServletRequest request) { 
      request.setMethod("PUT"); 
      return request; 
     } 
    }); 
    mvc.perform(builder 
      .file(file)) 
      .andExpect(status().ok()); 

就像一個魅力!

+0

很好的解決方法! –

+1

這應該是問題的解決方案,因爲它可以解決提問人的問題 – ftrujillo

+0

這肯定應該被標記爲答案。 – mogronalol

4

這很不幸在Spring MVC測試中不被支持,除了從標準實現中創建自己的自定義MockPutMultipartHttpServletRequestBuilder和複製粘貼代碼之外,我沒有看到解決方法。

對於什麼是值得的,Spring MVC默認也不支持PUT文件上傳請求。 Multipart解析器被硬編碼爲僅接受POST文件上傳請求 - 既適用於Apache Commons,也適用於標準Servlet API支持。

如果您希望Spring支持PUT請求,請隨時聯繫Spring的JIRA問題跟蹤器中的open a ticket

+0

我找到了一個簡單的解決方案!看看我的回答 – HammerNL

相關問題