Java 未来结果集的JUnit测试
我一直在模拟一个函数ResultSetFuture的测试,我使用了一个用于测试ResultSetFuture的示例,但是我正在测试/模拟的代码使用FuturessuccessfulAsList,如图所示。所以在第34行中,测试只是暂停,永远不会结束。下面显示的代码是暂停测试的一部分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 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来模拟静态方法,但现在不是重点。。。