Java 如何单元测试ExecutorService为任务生成新线程?

Java 如何单元测试ExecutorService为任务生成新线程?,java,multithreading,concurrency,Java,Multithreading,Concurrency,当使用ExecutorService时,一个单元如何测试是否为可运行任务生成了新线程 基本上,我的应用程序有一个静态线程池 public static final ExecutorService executorService = Executors.newCachedThreadPool(); 我希望在我的单元测试中使用这个线程池,而不是模仿一个线程池或注入一个新的线程池,因为不同的线程池可以显著地改变我的应用程序的行为(固定的、缓存的、计划的等等);我希望确保使用应用程序的运行时线程池测试

当使用ExecutorService时,一个单元如何测试是否为可运行任务生成了新线程

基本上,我的应用程序有一个静态线程池

public static final ExecutorService executorService = Executors.newCachedThreadPool();
我希望在我的单元测试中使用这个线程池,而不是模仿一个线程池或注入一个新的线程池,因为不同的线程池可以显著地改变我的应用程序的行为(固定的、缓存的、计划的等等);我希望确保使用应用程序的运行时线程池测试应用程序的行为

缓存线程池似乎最适合我。问题是,由于它是静态的,线程被缓存60秒,因此只有第一个测试会在池中实际生成一个新线程,而后续测试会重用该线程

单元测试代码:

public void testDoCallExecutesTaskInAnotherThread(){
最终客户端=this.createClient();
final ThreadPoolExecutor ThreadPoolExecutor=(ThreadPoolExecutor)client.getExecutorService();//获取静态线程池
final int initPoolSize=threadPoolExecutor.getPoolSize();
最终响应=client.doCall();
Assert.assertEquals(initPoolSize+1,threadPoolExecutor.getPoolSize());
}


如果您能就如何使此功能正常工作或使用其他方法提供建议,我们将不胜感激。

模拟
线程工厂

  ThreadFactory mock = new CustomObservableThreadFactory();
  ExecutorService executorService = Executors.newCachedThreadPool(mock);
  • 像往常一样将ExecutorService注入到被测试的类中
  • 但是使用自定义ThreadFactory来创建缓存的线程池: 每当调用新线程时,都将调用ThreadFactory。 然后,您可以根据需要跟踪这些实例化,例如使用侦听器或计数器

  • 为什么您关心客户机是否在单独的线程中执行调用?我可以看到人们关心诸如“这需要多长时间?”或“这个操作是否正确响应中断”之类的事情。但就目前而言,这似乎是一个糟糕的单元测试应用程序。问得好。这个特定的客户机必须异步执行一个web服务调用,这样它就不会占用使用它的对象——这在我的应用程序中是一个性能问题。我不是在等待响应,我只是想确保发出web服务调用的任务是异步生成的,这就是我的想法。因此,您真正应该测试的是它是否“保留了使用它的对象”。也就是说,需要多长时间?我可以以这样一种方式实现doCall:返回需要两天,但仍然会导致执行器创建另一个线程;您的单元测试仍然会通过,即使违反了您的标准。您是否介意“像往常一样”展示您是如何做的,或者给出一个说明它的引用?