我正在学习java8 CompletableFuture
,最后得到了这个。
首先,你觉得这几行代码怎么样?我需要向不同的服务并行发送请求,然后等待所有服务响应并继续工作。
//service A
CompletableFuture<ServiceAResponse> serviceAFuture = CompletableFuture.supplyAsync(
() -> this.ServiceA.retrieve(serviceARequest), serviceAExecutorService
);
//service B
CompletableFuture<ServiceBResponse> serviceBFuture = CompletableFuture.supplyAsync(
() -> this.ServiceB.retrieve(serviceBRequest), serviceBExecutorService
);
CompletableFuture.allOf(serviceAFuture, serviceBFuture).join();
ServiceAResponse responseA = serviceAFuture.join();
ServiceBResponse responseB = serviceBFuture.join();
即使代码做了我想做的事情,我在测试代码所在的类时也遇到了问题。我试着使用Mockito并做了如下操作:
doAnswer(invocation -> CompletableFuture.completedFuture(this.serviceAResponse))
.when(this.serviceAExecutorService)
.execute(any());
其中执行器服务和服务响应是模拟的,但测试永远不会结束,线程一直在等待此行中的内容
CompletableFuture.allOf(serviceAFuture, serviceBFuture).join();
型
你知道我错过了什么吗?谢谢!
3条答案
按热度按时间jqjz2hbq1#
如果我是您,我会简单地模拟服务A和B以及执行器,然后通过注解
@InjectMocks
注入它们,因为它们是类的字段。如果你想模拟
Executor
的方法execute
,你应该按照下面的步骤简单地调用所提供的Runnable
的方法run
:所以基本上你的测试应该是这样的:
n6lpvg4x2#
bmvo0sr53#
我已经为JUnit5和Mockito解决了这个问题
还有