Java 用Mockito模拟post请求会在;当(event.request().getParam(";type";).thenReturn(";应用程序/octet流";)时&引用;

Java 用Mockito模拟post请求会在;当(event.request().getParam(";type";).thenReturn(";应用程序/octet流";)时&引用;,java,unit-testing,junit,routing,mockito,Java,Unit Testing,Junit,Routing,Mockito,我试图用Mockito模拟一个文件上传(使用Vertx),但它在getParam(“type”)中抛出一个NullPointerError,用于when(event.request().getParam(“type”)。然后返回(“application/octet stream”) 我的单元测试如下: private UploadResultatenHandler uploadResultatenHandler; @Mock RoutingContext event; File folder

我试图用Mockito模拟一个文件上传(使用Vertx),但它在
getParam(“type”)
中抛出一个
NullPointerError
,用于
when(event.request().getParam(“type”)。然后返回(“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();
}
private UploadResultatenHandler UploadResultatenHandler;
@嘲弄
路由上下文事件;
文件夹;
设置上传;
HttpServerRequest HttpServerRequest;
HttpServerResponse HttpServerResponse;
@以前
公共作废设置(){
uploadResultatenHandler=新的uploadResultatenHandler();
initMocks(this);
when(event.request().getParam(“type”)).thenReturn(“应用程序/八位字节流”);
当(event.fileUploads())。然后返回(upload);
当(httpServerResponse.setStatusCode(200)),然后返回(httpServerResponse);
when(event.response()).thenReturn(httpServerResponse);
}
@试验
公共void testCleanHandler(){
uploadResultatenHandler.handle(事件);
验证(event.response();
}
“uploadResultatenHandler.handle(事件);”:

@覆盖
公共无效句柄(RoutingContext事件){
字符串newFileName=event.request().getParam(“类型”);
设置uploads=event.fileUploads();
System.out.println(上传);
用于(文件上载文件上载:上载){
String oldFileName=fileUpload.uploadedFileName();
char[]inhoud=FileReader.readFileUTF8ToString(旧文件名).tocharray();
String fileextension=setFileExtension(fileUpload.contentType());
createFile(newFileName,fileextension,“file uploads/”,inhoud);
FileDeleter.deleteFile(旧文件名);
}
event.response().setStatusCode(200).end(“检查”);
}
私有字符串setFileExtension(字符串类型){
开关(类型){
案例“text/xml”:
返回“.xml”;
案例“应用程序/八位字节流”:
返回“.json”;
违约:
返回“.txt”;
}
}
我认为这可能与mocked RoutingContext没有此参数有关,但我不知道如何修复/绕过此错误

我将行更改为when(event.request())。然后返回(request);when(request.getParam(“type”))。然后返回(“application/oct”)‌​et流);Mock to:Mock(answer=Answers.RETURNS\u DEEP\u STUBS)RoutingContext事件@模拟文件夹;设置上传;HttpServerRequest请求;HttpServerResponse;但我还是得到了一个空指针

堆栈跟踪:

java.lang.NullPointerException 在nl.icaprojecten.TestIntegratieQuintor.ServiceLayer.rest.UploadResultatenHandlerTest.setUp(UploadResultatenHandlerTest.java:42) 在sun.reflect.NativeMethodAccessorImpl.invoke0(本机方法)处 位于sun.reflect.NativeMethodAccessorImpl.invoke(未知源) 在sun.reflect.DelegatingMethodAccessorImpl.invoke处(未知源) 位于java.lang.reflect.Method.invoke(未知源) 位于org.junit.runners.model.FrameworkMethod$1.runReflectVeCall(FrameworkMethod.java:50) 位于org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12) 位于org.junit.runners.model.FrameworkMethod.invokeeexplosive(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.runChild(BlockJUnit4ClassRunner.java:57) 位于org.junit.runners.ParentRunner$3.run(ParentRunner.java:290) 位于org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71) 位于org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288) 访问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) 位于org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38) 位于org.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.run(RemoteTestRunner.java:382)
在org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:192)

上,由于您没有记录
事件.request()
的任何行为,它将返回
null
。当然,对其调用
getParam
将失败,并出现
NullPointerException
。有几种方法可以解决这个问题,但最优雅的方法是使用:


模拟不会递归地工作

你必须分开这条线

对此

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

当(event.request()).thenReturn(httpServerRequest)时,是否缺少一个
语句?@JonK我有以下行:when(event.request().getParam(“type”)).thenReturn(“应用程序/八位字节流”);我看得出来。但是我看不出您在哪里设置了
event.request()
应该返回的内容。如果您尚未设置,它将返回一个
null
。我将行更改为
when(event.request())。然后返回(request);when(request.getParam(“type”)).thenReturn(“应用程序/八位字节流”)和模拟到:
Mock(answer=Answers.RETURNS\u DEEP\u STUBS)RoutingContext事件;@Mock文件夹;设置上传;HttpServerRequest请求;HttpServerResponse但我仍然得到一个空点请将(完整)堆栈跟踪添加到您的问题中。
@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");