首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何对ExecutorService为任务产生新线程进行单元测试?

如何对ExecutorService为任务产生新线程进行单元测试?
EN

Stack Overflow用户
提问于 2009-11-04 03:01:27
回答 1查看 15K关注 0票数 8

在使用ExecutorService时,单元测试如何为可运行任务派生新线程?

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

代码语言:javascript
复制
public static final ExecutorService executorService = Executors.newCachedThreadPool();

我希望将这个线程池用于我的单元测试,而不是模拟一个线程池或注入一个新的线程池,因为不同的线程池可以极大地改变我的应用程序的行为(固定线程池、缓存线程池和调度线程池等等);我希望确保使用其运行时线程池测试应用程序的行为。

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

单元测试代码:

代码语言:javascript
复制
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());
}

建议如何让这个工作,或另一种方法,将不胜感激。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2009-11-04 03:12:17

模拟ThreadFactory

代码语言:javascript
复制
  ThreadFactory mock = new CustomObservableThreadFactory();
  ExecutorService executorService = Executors.newCachedThreadPool(mock);

  1. 像通常的
  2. 一样将ExecutorService注入到被测试的类中,但使用自定义的ThreadFactory来创建缓存的ThreadPool:每当要调用新的线程时,都会调用ThreadFactory。然后,您可以根据需要跟踪这些实例化,对侦听器或计数器执行e.g.with操作。
票数 19
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1669453

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档