2017-10-09 9 views
0

MultipartFile経由での画像のアップロードを処理するコントローラでPOSTメソッドをテストしています。空にすることは許されますが、ファイルが存在する場合はアップロードする必要があります。私は単体テストを書いて動作していることを確認しましたが、テストは失敗し、404が返されました。なぜ起こっているのか熟知していないからでしょう。ここではテストがあります:Springブート失敗の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 yep!今すぐ追加しました – NateH06

+0

テストクラスでSpringBootTestアノテーションまたはMvcWebTestアノテーションを追加しましたか?完全なテストクラスを提供してください。 –

答えて

1

私はあなたがMockMvcRequestBuilders.fileUpload("/newcontact")

の入力を間違えていることがわかったがMockMvcRequestBuilders.fileUpload("/newContact")

追加する必要があります: あなたのDTO

public class ContactDTO { 
    private MultipartFile conactImg; 
} 

要求マルチパートの名前はDTO、と同じでなければなりませんにタイプミスがありますABCPictureconactImgである必要があります

+0

ああ、大丈夫です。それは素晴らしいです、ありがとう!将来の読者にとっては、彼らは次のようになりました: 1.) "conact" typo。これのすべてのインスタンスを「接触」するように修正しました。 2.) '新しいMockMultipartFileは( "ABCPicture"、 "abcpic.png"、 "IMG/PNG"、.getBytes( "絵をシミュレートするためにバイトを生成"))'その名前はDTOフィールドの識別子名と一致していするために必要な@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@???????????????????????????????????????????????????????テスト、それは一致する必要があります。 'fileUpload("/newContact ")' – NateH06

関連する問題