2017-10-09 1 views
0

Ich teste eine POST-Methode in einem Controller, der das Hochladen eines Bildes über eine MultipartFile behandelt. Es darf leer sein, aber wenn eine Datei vorhanden ist, sollte sie hochgeladen werden. Ich schrieb einen Komponententest, um sicherzustellen, dass es funktioniert, aber der Test schlägt fehl und gibt einen 404 zurück, und ich bin mir nicht sicher warum - wahrscheinlich, weil ich nicht geschickt darin bin zu lesen, was passiert. Hier ist der Test:MultipartFile-Upload-Test im Spring Boot fehlgeschlagen - nicht sicher warum

@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"))); 
    } 

Und hier ist der Stack-Trace, der vom Laufen, dass Testergebnisse:

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) 

Edit:

Hier ist die Controller-Methode, die getestet wird:

@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 
    } 

Jede Einsicht würde sehr geschätzt werden.

+0

können Sie den Controller-Code hinzufügen? –

+0

@ ChiDov yep! gerade hinzugefügt – NateH06

+0

Haben Sie SpringBootTest oder MvcWebTest Annotation in der Testklasse hinzugefügt? Bitte geben Sie die vollständige Testklasse an. –

Antwort

1

fand ich heraus, dass man vertippt haben MockMvcRequestBuilders.fileUpload("/newcontact")

MockMvcRequestBuilders.fileUpload("/newContact")

Zusätzliche sein sollte: Es ist ein Tippfehler in Ihrem DTO

public class ContactDTO { 
    private MultipartFile conactImg; 
} 

Anfrage mehrteiliger Name gleich mit DTO sein sollte, ABCPicture sollte conactImg

sein
+0

Ahh, ok. Das ist erstaunlich, danke! Nur für zukünftige Leser waren sie: 1.) Der "conact" Tippfehler. Alle Instanzen von "Kontakt" wurden korrigiert. 2.) Die 'neue MockMultiPartFile (" ABCPicture "," abcpic.png ", " img/png "," Bytes generieren um ein Bild zu simulieren ".getBytes())' muss seinen Namen mit dem ID-Namen des DTO-Feldes übereinstimmen , so vertauschte 'ABCPicture' für die korrigierte' contactImg' und zuletzt 3.) Da der Controller folgendes hatte: '@GetMapping (path ="/newContact ")', ist der Pfad case-sensitive, also wenn ich ihn in der Test, muss es übereinstimmen. 'fileUpload ("/newContact ")' – NateH06

Verwandte Themen