java - 有没有办法在不使用 Thread.sleep 的情况下对 ScheduledExecutorService.scheduleAtFixedRate 进行单元测试?
问题描述
我想对一个使用 ScheduledExecutorService.scheduleAtFixedRate 执行任务的类进行单元测试,并且在不使用 Thread.sleep 的情况下,我找不到在单元测试中“安排”多次运行任务的方法,这很慢而且不像精确到我想要的。有没有办法将模拟的时间引用传递给执行程序服务或其他变通方法来模拟时间的流逝?
解决方案
单元测试独立于其依赖项来验证代码的行为。
的实现ScheduledExecutorService
由 JVM 提供,因此不是您的代码,而是在对代码进行单元测试时必须用测试替身替换的依赖项。(可能存在需要执行实现的测试的有效设置,但这不是单元测试。)ScheduledExecutorService
因此,如果您正在编写单元测试(而不是其他类型的测试,例如集成测试,恰好使用JUnit 框架),您应该使用模拟框架(如Mockito或类似框架) 为接口创建一个模拟,并且验证您的代码是否在模拟上调用了所需的方法。ScheduledExecutorService
为了使您的测试能够进行此验证,您应该将接口的实现 注入ScheduledExecutorService
到您的代码中(最好通过构造函数注入),而不是让您的被测单元自行获取它,这样您就有一个接缝,您可以在该接缝处交换ScheduledExecutorService
接口的实际实现出于单元测试的目的模拟。
推荐阅读
- vuejs2 - 如何在 vuejs2 中设置 CORS 标头?
- php - 立即发送电子邮件或将它们放入队列中?
- go - 当 SessionStore 来自导出的包时,没有设置 Gorilla/sessions cookie
- c++ - 奇怪的段错误
- docker - 关于 Golang 编译器的 docker 容器内的系统架构
- github - jenkinsfile 无法运行 Terraform
- haskell - 使用 map 和 sum 应用函数并对结果求和
- ios - UIDocumentPickerViewController 未调用 documentPicker 委托
- html - 如何解决:网站图标仅显示在我网站的主页上
- c# - 无法翻译 LINQ 表达式,将对其进行评估