![](/img/trans.png)
[英]How can a spring controller deal with application/octet-stream request?
[英]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.