【发布时间】:2017-03-29 18:32:11
【问题描述】:
我有一个方法,它开始在另一个线程中生成一些报告,而主线程返回一个指向应上传创建的报告的 google 文件夹的链接。创建报表后,它会在数据库中插入一条包含一些信息的记录。
public Link startReportCreation(ReportRequest reportRequest) {
Link link = /** some logic **/;
taskExecutor.execute(() -> {
/** report creation logic **/
});
return link;
那么在不修改startReportCreation方法的情况下测试插入记录信息的最佳方法是什么?
更新
目前我有while (taskExecutor.getActiveCount() != 0); 类型的锁,这表明taskExecutor 结束了它的执行,我可以检查数据库。但我认为有更好的方法。
顺便说一句,这是一种误导,这不是单元测试,它只是在真实数据上手动测试方法的执行器。
已解决
所以我设法重构了我的startReportCreation 方法,而不是简单的taskExecutor 我使用CompletableFuture,所以现在它看起来像这样:
public CompletableFuture<Link> startReportCreation(ReportRequest reportRequest) {
/** some logic **/
return CompletableFuture.supplyAsync(() -> {
Link link = /** some logic **/;
return link;
}, taskExecutor);
}
所以在生产代码中我使用CompletableFuture.getNow() 方法,在测试中我使用CompletableFuture.get() 来等待报告创建。
【问题讨论】:
标签: java multithreading testing