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

Ben*_*ons 8 java concurrency multithreading

在使用ExecutorService时,一个单元如何测试为Runnable任务生成新线程?

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

public static final ExecutorService executorService = Executors.newCachedThreadPool();
Run Code Online (Sandbox Code Playgroud)

我想将此线程池用于我的单元测试,而不是模拟一个或注入新的线程池,因为不同的线程池可以显着改变我的应用程序的行为(固定与缓存与预定等) ; 我想确保使用其运行时线程池测试应用程序的行为.

缓存线程池似乎最适合我.问题是因为它是静态的并且线程被缓存了60秒,所以只有第一个测试实际上会在池中产生一个新线程,而后续测试会重用该线程.

单元测试代码:

public void testDoCallExecutesTaskInAnotherThread() {    
    final Client client = this.createClient();
    final ThreadPoolExecutor threadPoolExecutor = (ThreadPoolExecutor) client.getExecutorService(); // gets the static thread pool
    final int initPoolSize = threadPoolExecutor.getPoolSize();
    final Response response = client.doCall();
    Assert.assertEquals(initPoolSize + 1, threadPoolExecutor.getPoolSize());
}
Run Code Online (Sandbox Code Playgroud)

关于如何完成这项工作或其他方法的建议将不胜感激.

mha*_*ler 19

嘲笑ThreadFactory:

  ThreadFactory mock = new CustomObservableThreadFactory();
  ExecutorService executorService = Executors.newCachedThreadPool(mock);
Run Code Online (Sandbox Code Playgroud)
  1. 像往常一样将ExecutorService注入到被测试的类中
  2. 但是使用自定义ThreadFactory来创建缓存的ThreadPool:只要调用新的Thread,就会调用ThreadFactory.然后,您可以根据需要跟踪这些实例化,例如使用监听器或计数器.

  • 您介意“像往常一样”展示您是如何做到的,或者提供一个显示它的参考吗? (2认同)