2014-06-23 86 views
1

我有一个应用程序,它使用ExecutorService创建多个线程&异步执行某些操作。Java执行服务集成测试

for (final Product product : products) { 
    executorService.submit(new Runnable() { 
     @Override 
     public void run() { 
      updateFewAttributes(product); 
     } 
    }); 
} 

我正在尝试编写一个集成测试来验证操作是否已正确执行。 由于操作是异步的,因此很难断言预期的属性。

试图在asserting之前做awaitTermination,但这似乎不起作用。

executorService.awaitTermination(3, TimeUnit.MINUTES); 
+3

我认为你必须在'awaitTermination'之前调用'shutdown'' – Thilo

回答

0

我会建议使用您自己的实现(或模拟)的ExecutorService,不会使用线程,而是模仿螺纹样的行为(或者可以使用的线程,但在可控制的方式)。这样你就可以根据需要拥有尽可能多的控制权。

这当然取决于被测试的代码是足够可测试的,以便使用不同的ExecutorService进行测试而不是生产,即要么将ExecutorService实例传递给它,要么将其注入到它中。

+0

这应该是一个“集成”测试。 – Thilo

+0

这不是问题。你唯一“嘲笑”/“伪造”的是执行者服务,它(就我所知,你的问题)是一个标准的实现。换句话说,您的测试像往常一样执行您的生产代码,但不是使用您无法控制的外部API,而是使用一个可以控制的假代码。这并不能改变被测代码(你的代码)是真实的事实。 – eitanfar

+0

我不知道......如果您假冒执行程序服务到您的代码不再以并发/异步方式运行的程度,那么您可能会遗漏线程安全中的细微问题(当然,取决于它们的细微程度,无论如何,用适量的测试你都不会抓住它们)。 – Thilo

0

ExecutorService会生成一个Future,您可以使用它来等待计算完成。根据ExecutorService文档:

方法提交延伸碱方法Executor.execute(了java.lang.Runnable)通过创建并返回一个可用于取消执行和/或等待完成的Future。

存放Future是你executorService.submit方法调用返回,然后在所有期货调用Future#get()将确保您的Runnable将完成执行。根据Future#get()文档:

等待如果必要的计算完成,然后检索其结果。

在此之后做出断言应该是安全的。

相关问题