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

2024-01-03

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

如何对 ExecutorService 为任务生成新线程进行单元测试? 的相关文章

随机推荐

  • OpenCV 设置键盘事件回调

    我在 OSX 和 Ubuntu 系统上使用 C 中的 openCV 我想要一个等效的函数setMouseCallback但对于键盘事件 按下按键 据我所知 在 openCV 中执行此操作的方法是使用waitKey 但实际上它不能用作回调 因
  • 如何动态添加 ng-click 处理程序

    我尝试在之前生成的按钮 动态 上添加 ng click 但效果不佳 我也尝试过在这个论坛上找到的所有解决方案 但没有一个能很好地工作 我的html代码 div class container max height div content d
  • 等待'background-image' css样式完全加载

    我的应用程序正在 Angular 5 中开发 我想先加载背景图片 div class sign in 然后才加载页面的其余部分 已经尝试过 窗口加载 窗口 文档 onload document getElementById mainDiv
  • 如何在iPhone中实现VoIP+SIP? [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我想为 iPhone 开发 VoIP 应用程序 但我不知道 VoIP 概念的基础知识 也不知道是否有任
  • msbuild PackageReference.PrivateAssets = 全部似乎不起作用

    我有一个引用 NUnit3TestAdapter 的测试项目 我不会将此引用复制到依赖于此的项目 我认为设置 PrivateAssets All 就可以了 但显然我误解了它的工作原理 因为它没有达到预期的效果 这是代码 汇总 Rollup
  • Java中字符与int的转换

    您无法从 int 转换为 char 因此这是非法的int i 88 char c i 然而这是允许的char c 88 不是一个普通的数字并且int文字 这怎么被允许呢 char实际上是 Java 中的无符号 16 位整数类型 与其他整数类
  • 无法通过反射休眠获取字段值

    我在 jpa 中更新对象时遇到问题 我有 Bean 用户 public class User Id GeneratedValue strategy GenerationType IDENTITY Column name id unique
  • 访问Android的OBEX服务器并读取数据

    我想知道是否可以使用 Bluecove 从 Windows 的 Android OBEX 服务器读取数据 联系人 未接来电等 我在 Windows 中尝试了以下代码 但它返回OBEX HTTP NOT ACCEPTABLE连接时 据我所知
  • Marklogic 8 Windows 7 安装后登录

    我已在具有 8Gb 内存的 64 位 Windows 7 计算机上安装了 MarkLogic 8 服务器似乎运行良好 除了我无法登录之外 一切似乎都很好 使用 使用 Marklogic Server 或 管理 Marklogic Serve
  • UIAlertController:addSubview

    我想向我的警报控制器添加一个子视图 但为什么按钮要放在顶部呢 我该如何解决这个问题 let alert UIAlertController title nil message nil preferredStyle UIAlertContro
  • HTTP 错误 404.3 - 未找到 - 由于扩展配置,无法提供您请求的页面

    HTTP 错误 404 3 未找到 由于扩展配置的原因 无法提供您请求的页面 如果页面是脚本 请添加处理程序 如果应下载该文件 请添加 MIME 映射 IIS 7 上托管的 WCF 服务出现此错误的原因可能是什么 已回答here https
  • Groovy 文件无法在 Intellij IDEA 中编译

    我有 Maven 项目 包含 java 和 groovy 测试 在命令行maven编译中 所有测试都在运行 但在我的IDEA项目 由 AutoImport maven项目 自动创建 中 IDEA将groovy文件复制到 target tes
  • IE7 与 Firefox/Opera/Chrome 之间的间距差异

    我对 IE7 与 Firefox Chrome Opera 中无序列表的垂直空间量一直存在问题 而且我似乎找不到解决方案 在IE7中 空间变小了 这也是我希望看到的 在 Firefox Chrome 和 Opera 中 之间的间距大约是原来
  • java.lang.RuntimeException:在android中createWindowSurface失败EGL_BAD_ALLOC

    我为我的应用程序创建了 1080x1920 的自定义 Galaxy S4 AVD 我可以在该 AVD 中运行我的应用程序 几秒钟后它会闪烁并抛出一些像这样的错误 02 05 12 06 39 809 E EGL emulation 829
  • 将泛型参数转换为整数或从整数转换

    我想编写通用类 旨在与内置类型一起使用 例如byte and ushort 在内部计算中 我需要将泛型类型转换为整数 然后再转换回泛型类型 我找到了编译此类代码的方法 例如 class Test
  • 使用arm-linux-androideabi-4.4.3编译ICU

    我想使用 Cygwin 交叉编译 Android 的 ICU 静态库 到目前为止 我已经能够配置和制作 Cygwin MSVC 和 Cygwin 版本 我已经安装了android ndk r7 并且可以在toolchains目录中看到gcc
  • 为什么应该使用条件样式表?

    这个问题涵盖了大部分内容 但我试图向想要完全放弃条件样式表 IE6 移动设备等 的高级开发人员提出一个清晰的论点 请记住 我们实际上并没有消除 IE6 只是消除了样式表 还是我疯了 应该接受这个 还有什么选择呢 CSS 黑客 我有 IE7
  • 当用户点击下拉列表 HTML 选择标签时,ios8 iPad uiwebview 在显示弹出窗口时崩溃

    在 ios8 和 iPad 上 如果uiwebview正在显示一个包含下拉列表的 HTML 页面 例如这个页面http www w3schools com tags tryit asp filename tryhtml select htt
  • Maven War 插件中的过滤

    我不明白 Maven War 插件的以下过滤器配置 有人可以向我解释一下他们在做什么吗 我已经用第一个示例和第二个示例标记了代码
  • 如何对 ExecutorService 为任务生成新线程进行单元测试?

    使用 ExecutorService 时 一个单元如何测试是否为可运行任务生成了新线程 基本上 我的应用程序有一个静态线程池 public static final ExecutorService executorService Execu