Java 用Mockito模拟post请求会在;当(event.request().getParam(";type";).thenReturn(";应用程序/octet流";)时&引用;
我试图用Mockito模拟一个文件上传(使用Vertx),但它在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
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");