首页 > 解决方案 > 有没有办法在不使用 Thread.sleep 的情况下对 ScheduledExecutorService.scheduleAtFixedRate 进行单元测试?

问题描述

我想对一个使用 ScheduledExecutorService.scheduleAtFixedRate 执行任务的类进行单元测试,并且在不使用 Thread.sleep 的情况下,我找不到在单元测试中“安排”多次运行任务的方法,这很慢而且不像精确到我想要的。有没有办法将模拟的时间引用传递给执行程序服务或其他变通方法来模拟时间的流逝?

标签: javaunit-testingscheduledexecutorservice

解决方案


单元测试独立于其依赖项来验证代码的行为。

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

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

为了使您的测试能够进行此验证,您应该将接口的实现 注入ScheduledExecutorService到您的代码中(最好通过构造函数注入),而不是让您的被测单元自行获取它,这样您就有一个接缝,您可以在该接缝处交换ScheduledExecutorService接口的实际实现出于单元测试的目的模拟。


推荐阅读