首页 文章

使用Mockito模拟一个post请求会在“when(event.request() . getParam(”type“))上抛出NullPointerException . thenReturn(”application / octet-stream“);”

提问于
浏览
1

我正在尝试使用Mockito模拟文件上传(使用Vertx),但它会在 when(event.request().getParam("type")).thenReturn("application/octet-stream"); 上使用的 NullPointerError 上抛出 NullPointerError

我的单元测试如下:

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( “应用程序/八位字节流”) . 和模拟:Mock(answer = Answers.RETURNS_DEEP_STUBS)RoutingContext事件; @Mock文件夹;设置上传; HttpServerRequest请求; HttpServerResponse响应;但我仍然得到一个NullPointer

堆栈跟踪:

java.lang.NullPointerException位于sun.reflect.NativeMethodAccessorImpl.invoke(未知来源)的sun.reflect.NativeMethodAccessorImpl.invoke0(本地方法)中的nl.icaprojecten.TestIntegratieQuintor.ServiceLayer.rest.UploadResultatenHandlerTest.setUp(UploadResultatenHandlerTest.java:42)在sun.reflect.DelegatingMethodAccessorImpl.invoke(来源不明)在java.lang.reflect.Method.invoke(来源不明)在org.junit.runners.model.FrameworkMethod $ 1.runReflectiveCall(FrameworkMethod.java:50)在org.junit .internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)在org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:47)在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) rs.ParentRunner $ 3.run(ParentRunner.java:290)org.junit.runners.ParentRunner $ 1.schedule(ParentRunner.java:71)org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288)at org .junit.runners.ParentRunner.access $ 000(ParentRunner.java:58)org.junit.runners.ParentRunner $ 2.evaluate(ParentRunner.java:268)org.junit.runners.ParentRunner.run(ParentRunner.java:363) )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)处org.eclipse.jdt 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)

2 回答

  • 3

    由于您没有记录 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");
    

相关问题