簡體   English   中英

用Mockito模擬發布請求會在“ when(event.request()。getParam(“ type”))。thenReturn(“ application / octet-stream”);”上引發NullPointerException

[英]Mocking a post request with Mockito throws NullPointerException on “when(event.request().getParam(”type“)).thenReturn(”application/octet-stream“);”

我正在嘗試使用Mockito模擬文件上傳(使用Vertx),但它會在when(event.request().getParam("type")).thenReturn("application/octet-stream"); getParam("type")使用的getParam("type")上引發NullPointerError 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(event);”

@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); when(request.getParam(“ type”))。thenReturn(“ application / octetetstream”); 以及模擬到:Mock(answer = Answers.RETURNS_DEEP_STUBS)RoutingContext事件; @Mock文件文件夾; 設置上傳; HttpServerRequest請求; HttpServerResponse響應; 但我仍然得到一個NullPointer

堆棧跟蹤:

nl.icaprojecten.TestIntegratieQuintor.ServiceLayer.rest.UploadResultatenHandlerTest.setUp(UploadResultatenHandlerTest.java:42)處的java.lang.NullPointerException在org.junit.runners.model.FrameworkMethod $ 1.runReflectiveCall(FrameworkMethod.java:50)在sun.reflect.DelegatingMethodAccessorImpl.invoke(未知源)在java.lang.reflect.Method.invoke(未知源)在org.junit org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:47)上的.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)org.junit.internal.runners.statements.RunBefores.evaluate (RunBefores.java:24)在org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:325)在org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:78)在org.junit.runners.BlockJUnit4ClassRunner。 org.junit.runne上的runChild(BlockJUnit4ClassRunner.java:57) org.junit.runners.rs.ParentRunner $ 3.run(ParentRunner.java:290)org org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288)org.junit.runners.ParentRunner $ 1.schedule(ParentRunner.java:71) org.junit.runners.ParentRunner.access.000(ParentRunner.java:58)在org.junit.runners.ParentRunner.run(ParentRunner.java:363)上的.junit.runners.ParentRunner.access $ 000(ParentRunner.java:58) ),位於org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)的org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:86)處。 org.eclipse.jdt上的eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:459)位於org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:678)。 org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:192)上的internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:382)

由於您尚未記錄event.request()任何行為,因此它將返回null 當然,對其調用getParam將會失敗,並出現NullPointerException 有幾種解決方法,但是最優雅的恕我直言,是使用深度樁

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

模擬無法遞歸工作。

你必須把這行分開

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM