Java 有没有一种方法可以在不使用Thread.sleep的情况下对ScheduledExecutorService.scheduleAtFixedRate进行单元测试?

Java 有没有一种方法可以在不使用Thread.sleep的情况下对ScheduledExecutorService.scheduleAtFixedRate进行单元测试?,java,unit-testing,scheduledexecutorservice,Java,Unit Testing,Scheduledexecutorservice,我想使用ScheduledExecutorService.scheduleAtFixedRate对一个执行任务的类进行单元测试,如果不使用Thread.sleep,我无法找到在单元测试中“计划”任务的多次运行的方法,因为Thread.sleep很慢,而且不像我希望的那样精确。有没有办法将模拟时间引用传递给executor服务或其他变通方法,以模拟时间的流逝?单元测试将验证代码的行为,并将其与依赖项隔离开来 ScheduledExecutorService的实现是由JVM提供的,因此不是您的代码,

我想使用ScheduledExecutorService.scheduleAtFixedRate对一个执行任务的类进行单元测试,如果不使用Thread.sleep,我无法找到在单元测试中“计划”任务的多次运行的方法,因为Thread.sleep很慢,而且不像我希望的那样精确。有没有办法将模拟时间引用传递给executor服务或其他变通方法,以模拟时间的流逝?

单元测试将验证代码的行为,并将其与依赖项隔离开来

ScheduledExecutorService
的实现是由JVM提供的,因此不是您的代码,而是在单元测试代码时必须用test double替换的依赖项。(可能存在需要执行
ScheduledExecutorService
实现的测试的有效设置,但这不是单元测试。)

因此,如果您正在编写单元测试(而不是其他类型的测试,例如集成测试,它恰好使用JUnit框架),您应该使用模拟框架(类似或类似)为
ScheduledExecutorService
接口创建一个mock并验证您的代码是否在模拟上调用了所需的方法


要启用此验证的测试,您应该将
ScheduledExecutorService
接口的实现注入到代码中(最好是通过),而不是让受测单元自己获取它,这样,您就有了一个seam,您可以将
ScheduledExecutorService
接口的实际实现与mock进行交换,以便进行单元测试

您可以编写自己的ScheduledExecutorService实现,并向其中添加一些额外的方法,如“fireEventsBefore(time)”。这对你有用吗?我想这是一种错误的方式,你应该以固定的速率对执行的逻辑进行单元测试,你应该相信标准库能够正确地完成它的工作。测试这一点并不取决于您。我想在这里测试的部分是如何处理ScheduledExecutorService中出现的错误,例如在一次执行抛出错误后是否继续执行runnable,这不是类的默认功能。