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.
können Sie den Controller-Code hinzufügen? –
@ ChiDov yep! gerade hinzugefügt – NateH06
Haben Sie SpringBootTest oder MvcWebTest Annotation in der Testklasse hinzugefügt? Bitte geben Sie die vollständige Testklasse an. –