Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/370.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 未来结果集的JUnit测试_Java_Unit Testing_Junit_Resultset_Future - Fatal编程技术网

Java 未来结果集的JUnit测试

Java 未来结果集的JUnit测试,java,unit-testing,junit,resultset,future,Java,Unit Testing,Junit,Resultset,Future,我一直在模拟一个函数ResultSetFuture的测试,我使用了一个用于测试ResultSetFuture的示例,但是我正在测试/模拟的代码使用FuturessuccessfulAsList,如图所示。所以在第34行中,测试只是暂停,永远不会结束。下面显示的代码是暂停测试的一部分 ResultSetFuture future = Mockito.mock(ResultSetFuture.class); Mockito.doReturn(result).when(future).get(); M

我一直在模拟一个函数ResultSetFuture的测试,我使用了一个用于测试ResultSetFuture的示例,但是我正在测试/模拟的代码使用FuturessuccessfulAsList,如图所示。所以在第34行中,测试只是暂停,永远不会结束。下面显示的代码是暂停测试的一部分

ResultSetFuture future = Mockito.mock(ResultSetFuture.class);
Mockito.doReturn(result).when(future).get();
Mockito.doReturn(future).when(session).executeAsync(Mockito.anyString());

ResultSetFuture resultF = session.executeAsync("select value from table where key='a'");

Future<List<ResultSet>> data = Futures.successfulAsList(new ArrayList(){{ add(resultF); }});
List finished = data.get(); //  <---- The test stops here
您需要在将来模拟isDone方法,以指示执行已完成并避免代码停止

ResultSetFuture future = Mockito.mock(ResultSetFuture.class);
Mockito.doReturn(result).when(future).get();
Mockito.doReturn(future).when(session).executeAsync(Mockito.anyString());
Mockito.doReturn(true).when(future).isDone(); //<-- mock to avoid halting

ResultSetFuture resultF = session.executeAsync("select value from table where key='a'");

Future<List<ResultSet>> data = Futures.successfulAsList(Collections.singletonList(resultF));
List finished = data.get(); //  <---- The test stops here
您必须模拟isDone和addListener方法:

ResultSetFuture=Mockito.mockResultSetFuture.class; Mockito.doReturnresult.whenfuture.get; Mockito.doReturntrue.whenfuture.isDone; Mockito.doAnsweri->{ i、 getArgumentAt1,Executor.class.executei.getArgumentAt0,Runnable.class; 返回null; }.whenfuture.addListenerany,任何; Mockito.doReturnfuture.whensession.executeAsyncMockito.anyString; ResultSetFuture resultF=session.executeasync从key='a'所在的表中选择值; Future data=Futures.successfulAsListCollections.singletonListresultF; List finished=data.get;
addListener是必需的,因为Futures.successfulAsList添加了一个监听器,它将完成Futures.successfulAsList返回的未来。

我对此主题了解得不够,但静态方法successfulAsList可能不会调用您模拟的方法,然后再也得不到响应?是的,我发现它创建了监听器,以便将第一个完成的内容添加到我猜的响应中。那我怎么能嘲笑这件事呢?奇怪的是,您正在模拟session.executeAsync,然后在同一测试中调用它,而不是将它传递给您的测试代码。这似乎是不必要的。是的,显示的代码只是它停止的部分,它与测试本身是隔离的,在我的实际测试中,它有更多的逻辑使用ExecuteAsyncil的结果,你可以找到调用的方法,模拟那个方法。否则,我不确定,因为我实际上不知道这个测试的意义,使用PowerMockito和模拟静态方法会是一个想法吗?我总是尽量避免使用PowerMockito,我总是尽量避免使用静态方法,但有时也没有选择。嗨,我测试了Mockito.doReturnresult.whenfuture.getuntinrupty这些方法;还有Mockito.doReturntrue.whenfuture.isDone;。不走运尝试使用Collections.singletonListresultF而不是新的ArrayList{{{addresultF;}}}不走运,测试尚未完成:/I我认为您需要模拟Futures.successfulAsList。否则,您将测试不属于.Hmmm的Futures类,但该方法是一个静态方法,无法使用junit对其进行模拟,因此,我们解决了这个问题,创建了一个调用Futures.successfulAsList的包装bean并对其进行模拟。pd:我们知道我们可以使用PowerMock来模拟静态方法,但现在不是重点。。。