2017-04-13 30 views
1

我知道類似的問題已經在這裏幾次了,但是下面的建議修復並未解決我的問題。使用TestRestTemplate進行多部分POST請求的集成測試返回400

我有以下端點的簡單的控制器:

@RequestMapping(method = RequestMethod.POST) 
public ResponseEntity<String> singleFileUpload(@RequestParam("file") MultipartFile file) { 
    log.debug("Upload controller - POST: {}", file.getOriginalFilename()); 

    // do something 
} 

我試圖寫一個集成測試它使用Spring TestRestTemplate的,但我所有的attemps與400 - Bad Request結束(無日誌澄清什麼地方出了錯安慰)。

控制器內部的日誌未被命中,因此在達到目標之前失敗。

請你看看我的測試,並建議我做錯了什麼?

@Test 
public void testUpload() { 
    // simulate multipartfile upload 
    ClassLoader classLoader = getClass().getClassLoader(); 
    File file = new File(classLoader.getResource("image.jpg").getFile()); 

    MultiValueMap<String, Object> parameters = new LinkedMultiValueMap<String, Object>(); 
    parameters.add("file", file); 

    HttpHeaders headers = new HttpHeaders(); 
    headers.setContentType(MediaType.MULTIPART_FORM_DATA); 

    HttpEntity<MultiValueMap<String, Object>> entity = new HttpEntity<MultiValueMap<String, Object>>(parameters, headers); 

    ResponseEntity<String> response = testRestTemplate.exchange(UPLOAD, HttpMethod.POST, entity, String.class, ""); 

    // Expect Ok 
    assertThat(response.getStatusCode(), is(HttpStatus.OK)); 
} 
+0

看起來您正在設置ContentType = MULTIPART_FORM_DATA測試。但是你的控制器沒有設置爲接收這種類型的請求。 嘗試使用consumes = {MediaType.MULTIPART_FORM_DATA_VALUE} 請發佈Test類的其餘部分,因爲有些缺失的部分我無法在這裏複製 –

+0

@BrunoLeite感謝您的建議。我試過了,但事實並非如此。 – Smajl

+0

你真的會返回一個字符串與你的響應實體嗎?你是否證實了你的400反應的內容,以防止它提供更多細節?你有沒有考慮過使用調試器來運行它還是實現一個異常處理程序? – eis

回答

1

我試過如下:

@Test 
public void testUpload() { 
    LinkedMultiValueMap<String, Object> parameters = new LinkedMultiValueMap<String, Object>(); 
    parameters.add("file", new org.springframework.core.io.ClassPathResource("image.jpg")); 

    HttpHeaders headers = new HttpHeaders(); 
    headers.setContentType(MediaType.MULTIPART_FORM_DATA); 

    HttpEntity<LinkedMultiValueMap<String, Object>> entity = new HttpEntity<LinkedMultiValueMap<String, Object>>(parameters, headers); 

    ResponseEntity<String> response = testRestTemplate.exchange(UPLOAD, HttpMethod.POST, entity, String.class, ""); 

    // Expect Ok 
    assertThat(response.getStatusCode(), is(HttpStatus.OK)); 
} 

正如你可以看到我用org.springframework.core.io.ClassPathResource作爲對象的文件和Ti工作就像一個魅力

我希望這是有用的

Angelo

+0

首先,我不清楚是什麼導致了這個問題。多部分控制器是否與'java.io.File'不兼容?無論如何,它確實像魅力一樣工作,謝謝。這爲我節省了很多工作! – Smajl

+0

@Smajl我猜測剩下的模板能夠比傳遞一個簡單的'java.io.File'更好地管理'org.springframework.core.it.Resource'實現。 –

相關問題