使用 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());
}
关于如何实现此功能或其他方法的建议将不胜感激。
嘲笑ThreadFactory
:
ThreadFactory mock = new CustomObservableThreadFactory();
ExecutorService executorService = Executors.newCachedThreadPool(mock);
- 像往常一样将 ExecutorService 注入到被测类中
- 但使用一个自定义线程工厂用于创建缓存的线程池:
每当要调用新线程时,都会调用 ThreadFactory。
然后,您可以根据需要跟踪这些实例化,例如使用侦听器或计数器。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)