2017-10-09 58 views
0

我在控制器中測試POST方法,該控制器通過MultipartFile處理圖像的上傳。它可以是空的,但如果有文件存在,它應該上傳它。我寫了一個單元測試以確保它能夠正常工作,但是測試失敗,返回了404,我不確定爲什麼 - 可能是因爲我不擅長閱讀正在發生的事情。這裏的測試:在Spring Boot中MultipartFile上傳測試失敗 - 不知道爲什麼

@Test 
    public void saveAnEntryWhenPOSTNewUserWithAPicture() throws Exception { 
    MockMultipartFile multiPFImage = new MockMultipartFile("ABCPicture", "abcpic.png", 
      "img/png", "Generate bytes to simulate a picture".getBytes()); 
    mockMvc.perform(MockMvcRequestBuilders.fileUpload("/newcontact") 
      .file(multiPFImage) 
      .param("userId", "12345") 
      .param("name", "Picture Uploader User")) 
      .andExpect(status().isOk()) 
      .andExpect(content().string(containsString("savedContact"))); 
    } 

而這裏的堆棧跟蹤的運行測試結果:

MockHttpServletRequest: 
     HTTP Method = POST 
     Request URI = /newContact 
     Parameters = {userId=[12345], name=[John Smith]} 
      Headers = {} 

Handler: 
      Type = app.controllers.AdditiveController 
      Method = public java.lang.String app.controllers.AdditiveController.createNewContact(app.models.dto.ContactDTO) 

Async: 
    Async started = false 
    Async result = null 

Resolved Exception: 
      Type = null 

ModelAndView: 
     View name = null 
      View = null 
      Model = null 

FlashMap: 
     Attributes = null 

MockHttpServletResponse: 
      Status = 200 
    Error message = null 
      Headers = {Content-Type=[text/plain;charset=UTF-8], Content-Length=[12]} 
    Content type = text/plain;charset=UTF-8 
      Body = savedContact 
    Forwarded URL = null 
    Redirected URL = null 
      Cookies = [] 

MockHttpServletRequest: 
     HTTP Method = GET 
     Request URI = /newContact 
     Parameters = {} 
      Headers = {} 

Handler: 
      Type = app.controllers.AdditiveController 
      Method = public app.models.dto.ContactDTO app.controllers.AdditiveController.sendNewContactForm(org.springframework.ui.Model) 

Async: 
    Async started = false 
    Async result = null 

Resolved Exception: 
      Type = null 

ModelAndView: 
     View name = null 
      View = null 
      Model = null 

FlashMap: 
     Attributes = null 

MockHttpServletResponse: 
      Status = 200 
    Error message = null 
      Headers = {Content-Type=[application/json;charset=UTF-8]} 
    Content type = application/json;charset=UTF-8 
      Body = {"userId":null,"contactId":null,"name":null,"email":null,"bday":null,"address":null,"city":null,"state":null,"phones":null,"contactImg":null} 
    Forwarded URL = null 
    Redirected URL = null 
      Cookies = [] 

MockHttpServletRequest: 
     HTTP Method = POST 
     Request URI = /newcontact 
     Parameters = {userId=[12345], name=[Picture Uploader User]} 
      Headers = {Content-Type=[multipart/form-data;charset=UTF-8]} 

Handler: 
      Type = org.springframework.web.servlet.resource.ResourceHttpRequestHandler 

Async: 
    Async started = false 
    Async result = null 

Resolved Exception: 
      Type = null 

ModelAndView: 
     View name = null 
      View = null 
      Model = null 

FlashMap: 
     Attributes = null 

MockHttpServletResponse: 
      Status = 404 
    Error message = null 
      Headers = {} 
    Content type = null 
      Body = 
    Forwarded URL = null 
    Redirected URL = null 
      Cookies = [] 

java.lang.AssertionError: Status 
Expected :200 
Actual :404 
<Click to see difference> 


    at org.springframework.test.util.AssertionErrors.fail(AssertionErrors.java:54) 
    at org.springframework.test.util.AssertionErrors.assertEquals(AssertionErrors.java:81) 
    at org.springframework.test.web.servlet.result.StatusResultMatchers$10.match(StatusResultMatchers.java:665) 
    at org.springframework.test.web.servlet.MockMvc$1.andExpect(MockMvc.java:171) 
    at app.controllers.AdditiveControllerShould.saveAnEntryWhenPOSTNewUserWithAPicture(AdditiveControllerShould.java:72) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
    at java.lang.reflect.Method.invoke(Method.java:498) 
    at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:50) 
    at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12) 
    at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:47) 
    at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17) 
    at org.springframework.test.context.junit4.statements.RunBeforeTestMethodCallbacks.evaluate(RunBeforeTestMethodCallbacks.java:75) 
    at org.springframework.test.context.junit4.statements.RunAfterTestMethodCallbacks.evaluate(RunAfterTestMethodCallbacks.java:86) 
    at org.springframework.test.context.junit4.statements.SpringRepeat.evaluate(SpringRepeat.java:84) 
    at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:325) 
    at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:252) 
    at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:94) 
    at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290) 
    at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71) 
    at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288) 
    at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58) 
    at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268) 
    at org.springframework.test.context.junit4.statements.RunBeforeTestClassCallbacks.evaluate(RunBeforeTestClassCallbacks.java:61) 
    at org.springframework.test.context.junit4.statements.RunAfterTestClassCallbacks.evaluate(RunAfterTestClassCallbacks.java:70) 
    at org.junit.runners.ParentRunner.run(ParentRunner.java:363) 
    at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.run(SpringJUnit4ClassRunner.java:191) 
    at org.junit.runner.JUnitCore.run(JUnitCore.java:137) 
    at com.intellij.junit4.JUnit4IdeaTestRunner.startRunnerWithArgs(JUnit4IdeaTestRunner.java:68) 
    at com.intellij.rt.execution.junit.IdeaTestRunner$Repeater.startRunnerWithArgs(IdeaTestRunner.java:47) 
    at com.intellij.rt.execution.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:242) 
    at com.intellij.rt.execution.junit.JUnitStarter.main(JUnitStarter.java:70) 

編輯:

這裏是正在測試的控制器方法:

@PostMapping(path = "/newContact") 
    public String createNewContact(@ModelAttribute ContactDTO newContact) { 
    Contact contact = new Contact(newContact.getUserId(), newContact.getName()); 
    setOptionalContactFields(contact, newContact); 
    contactDAO.save(contact); // contactId automatically generated here (via SQL autoIncrement) 
    newContact.setContactId(contact.getContactId()); // update the newContact to include the contactId 
    if (newContact.getContactImg() !=null) { 
     uploadContactProfileImg(newContact); // handles actual saving of image to persistence layer 
    } 

    return "savedContact"; // assumes template that can display all fields of a Contact will be returned 
    } 

任何有識之士將不勝感激。

+0

你可以添加控制器代碼嗎? –

+0

@ChiDov是的!現在只需添加它 – NateH06

+0

您是否在測試類中添加了SpringBootTest或MvcWebTest註釋?請提供完整的測試課程。 –

回答

1

我發現你有輸錯MockMvcRequestBuilders.fileUpload("/newcontact")

應該MockMvcRequestBuilders.fileUpload("/newContact")

附加: 有一個在你的DTO一個錯字

public class ContactDTO { 
    private MultipartFile conactImg; 
} 

要求多名稱應與DTO,相同ABCPicture應該是conactImg

+0

啊,好的。太棒了,謝謝!只爲未來的讀者,他們是: 1)「conact」錯字。更正了這個「聯繫」的所有情況。 2.)'new MockMultipartFile(「ABCPicture」,「abcpic.png」, 「img/png」,「生成字節以模擬圖片」.getBytes())需要使其名稱與DTO字段的標識符名稱匹配,因此交換'ABCPicture'爲糾正的'contactImg'和最後3.)因爲控制器有這個:'@GetMapping(path =「/ newContact」)',路徑是區分大小寫的,所以當我在測試,它需要匹配。 '文件上傳( 「/ newContact」)' – NateH06