java—如何单元测试executorservice为任务生成新线程?

zhte4eai  于 2021-06-30  发布在  Java
关注(0)|答案(1)|浏览(683)

当使用executorservice时,一个单元如何测试是否为可运行任务生成了一个新线程?
基本上,我的应用程序有一个静态线程池。

public static final ExecutorService executorService = Executors.newCachedThreadPool();

我想在我的单元测试中使用这个线程池,而不是模仿一个线程池或注入一个新的线程池,因为不同的线程池可以极大地改变我的应用程序的行为(固定的、缓存的、计划的等等);我想确保我用它的运行时线程池测试应用程序的行为。
缓存线程池似乎最适合我。问题是,由于它是静态的,线程被缓存了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());
}

建议如何使这一工作,或其他方法完全将不胜感激。

6tr1vspr

6tr1vspr1#

嘲笑 ThreadFactory :

ThreadFactory mock = new CustomObservableThreadFactory();
  ExecutorService executorService = Executors.newCachedThreadPool(mock);

像往常一样将executorservice注入到被测试的类中
但是使用定制的threadfactory来创建缓存的线程池:每当要调用新线程时,都会调用threadfactory。然后可以根据需要跟踪这些示例化,例如使用侦听器或计数器。

相关问题