2016-12-21 36 views
1

我試圖嘲弄文件上傳(使用Vertx)有,但的Mockito它拋出的getParam("type")一個NullPointerErrorwhen(event.request().getParam("type")).thenReturn("application/octet-stream");使用Mockito嘲諷post請求拋出NullPointerException on「when(event.request()。getParam(」type「))。thenReturn(」application/octet-stream「);」

我的單元測試中使用如下:

private UploadResultatenHandler uploadResultatenHandler; 

@Mock 
RoutingContext event; 
File folder; 
Set<io.vertx.ext.web.FileUpload> upload; 
HttpServerRequest httpServerRequest; 
HttpServerResponse httpServerResponse; 

@Before 
public void setUp() { 
    uploadResultatenHandler = new UploadResultatenHandler(); 
    MockitoAnnotations.initMocks(this); 

    when(event.request().getParam("type")).thenReturn("application/octet-stream"); 
    when(event.fileUploads()).thenReturn(upload); 

    when(httpServerResponse.setStatusCode(200)).thenReturn(httpServerResponse); 
    when(event.response()).thenReturn(httpServerResponse); 
} 

@Test 
public void testCleanHandler() { 
    uploadResultatenHandler.handle(event); 
    verify(event).response(); 
} 

「uploadResultatenHandler.handle(事件);」 :

@Override 
public void handle(RoutingContext event) { 
    String newFileName = event.request().getParam("type"); 
    Set<FileUpload> uploads = event.fileUploads(); 
    System.out.println(uploads); 
    for (FileUpload fileUpload : uploads) { 
     String oldFileName = fileUpload.uploadedFileName(); 

     char[] inhoud = FileReader.readFileUTF8ToString(oldFileName).toCharArray(); 
     String fileExtention = setFileExtension(fileUpload.contentType()); 

     FileCreater.createFile(newFileName, fileExtention, "file-uploads/", inhoud); 
     FileDeleter.deleteFile(oldFileName); 
    } 
    event.response().setStatusCode(200).end("Check"); 
} 

private String setFileExtension(String type) { 
    switch (type) { 
    case "text/xml": 
     return ".xml"; 
    case "application/octet-stream": 
     return ".json"; 
    default: 
     return ".txt"; 
    } 
} 

我認爲它可能有一些做的嘲笑RoutingContext沒有這個參數,但我不知道如何解決/旁路這個錯誤?

我把行改爲when(event.request())。thenReturn(request);當(request.getParam( 「類型」))thenReturn( 「應用程序/辛等流」)。並嘲笑:模擬(answer = Answers.RETURNS_DEEP_STUBS)RoutingContext事件; @Mock文件夾;設置上傳; HttpServerRequest請求; HttpServerResponse響應;但我仍然得到一個空指針

堆棧跟蹤:

顯示java.lang.NullPointerException 在nl.icaprojecten.TestIntegratieQuintor.ServiceLayer.rest.UploadResultatenHandlerTest.setUp(UploadResultatenHandlerTest.java:42) 在陽光下。 reflect.NativeMethodAccessorImpl.invoke0(本機方法) 在sun.reflect.NativeMethodAccessorImpl.invoke(來源不明) 在sun.reflect.DelegatingMethodAccessorImpl.invoke(來源不明) 在java.lang.reflect.Method.invoke(來源不明) at org.junit.runners.model.FrameworkMethod $ 1.runReflectiveCall(FrameworkMethod.java:50)(org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12) at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:47) at org.junit.internal。 runner.statements.RunBefores.evaluate(RunBefores.java:24) at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:325) at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:78) 在org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:57) 在org.junit.runners.ParentRunner $ 3.run(ParentRunner.java:290) 在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.junit.runners.ParentRunner.run(ParentRunner .java:363) at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:86) at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java :38) at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:459) at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:678 ) at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:382) at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java :192)

+0

你不是缺少一個'時(event.request())thenReturn(httpServerRequest);'您的設置方法中的聲明? – JonK

+0

@JonK我有以下行:when(event.request()。getParam(「type」))。thenReturn(「application/octet-stream」); –

+0

我可以看到。但是我不知道你在哪裏設置了event.request()應該返回的內容。如果你沒有設置*那麼,它會返回一個'null'。 – JonK

回答

2

由於您沒有記錄event.request()的任何表現,它會返回null。當然,調用getParam將失敗,出現NullPointerException。還有它周圍的一些方法,但最優雅的,恕我直言,是使用deep stubbing

@Mock(answer = Answers.RETURNS_DEEP_STUBS) 
RoutingContext event; 
0

嘲諷功能不能遞歸調用。 。

必須拆分該行

when(event.request().getParam("type")).thenReturn("application/octet-stream"); 

這個

Request request = mock(Request.class); 
when(event.request()).thenReturn(request); 
when(request.getParam("type")).thenReturn("application/octet-stream"); 
+0

我把這行改爲'when(event.request())。thenReturn(request); (request.getParam(「type」))。thenReturn(「application/octet-stream」);'和mocks to:'Mock(answer = Answers.RETURNS_DEEP_STUBS) \t RoutingContext event; \t \t @Mock \t文件夾; \t設置上傳; \t HttpServerRequest請求; \t HttpServerResponse響應;'但我仍然得到空指針 –

+0

請添加(完整)stacktrace到您的問題。 –