在spring项目,假设我们有一个方法
// 一个executor,和普通定义线程池一样(此处是spring自带,@Scheduled注解用到的全局线程池)
@Resource
private ThreadPoolTaskExecutor executor;
// 另一个需要装配的假定的服务
@Resource
private AnotherService anotherService;
// CompletableFuture,需要被测试的方法
public String getProductBillSummaryList(String input) {
// 异步操作
CompletableFuture<String> resultFuture = CompletableFuture.supplyAsync(
() -> anotherService.someMethod(input), executor);
// 等待执行完毕
CompletableFuture.allOf(resultFuture).join();
try {
String s = resultFuture.get();
System.out.println(s);
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
我们对这个方法单元测试,大概率就直接写成:
@Mock
private AnotherService anotherService;
@InjectMocks
private ProductTransactionSearchServiceImpl productTransactionSearchService;
@Test
public void getProductBillSummaryList() {
Mockito.when(anotherService.someMethod(Mockito.any())).thenReturn("mockString");
String res = productTransactionSearchService.getProductBillSummaryList("input");
Assert.assertNull(res);
}
这样会导致Completable的线程不运行,一直阻塞在红色箭头指示的地方:
等待线程执行完毕。然而线程并没有执行。
此时需要模拟并驱动异步线程的执行,因此需要这样写:
@Mock
private AnotherService anotherService;
// 需要增加这个executor的mock
@Mock
private ThreadPoolTaskExecutor executor;
@InjectMocks
private ProductTransactionSearchServiceImpl productTransactionSearchService;
@Test
public void getProductBillSummaryList() {
Mockito.when(anotherService.someMethod(Mockito.any())).thenReturn("mockString");
// 新增对异步线程里面Runnable方法的驱动
Mockito.doAnswer(
(InvocationOnMock invocation) -> {
((Runnable) invocation.getArguments()[0]).run();
return null;
}
).when(executor).execute(Mockito.any(Runnable.class));
String res = productTransactionSearchService.getProductBillSummaryList("input");
Assert.assertNull(res);
}
这样就mock了对Runnable方法的运行(就是执行run方法,只要有调用就run,不阻塞)
运行单测就可以正常通过了。
参考
java - CompletableFuture usability and unit test - Stack Overflow文章来源:https://www.toymoban.com/news/detail-697596.html
文章来源地址https://www.toymoban.com/news/detail-697596.html
到了这里,关于CompletableFuture的单元测试Mock的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!