在Spring Boot中MultipartFile上传测试失败 - 不知道为什么

问题描述:

我在控制器中测试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注释?请提供完整的测试课程。 –

我发现你有输错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