有没有办法在不使用Thread.sleep的情况下对ScheduledExecutorService.scheduleAtFixedRate进行单元测试?

时间:2019-12-02 20:59:20

标签: java unit-testing scheduledexecutorservice

我想对使用ScheduledExecutorService.scheduleAtFixedRate执行任务的类进行单元测试,并且我无法找到一种方法来在单元测试中“调度”任务的多次运行,而无需使用Thread.sleep,这很慢并没有我想要的那么精确。有什么方法可以将模拟的时间参考传递给执行服务或其他变通方法来模拟时间的流逝吗?

1 个答案:

答案 0 :(得分:0)

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

ScheduledExecutorService的实现由JVM提供,因此不是由您的代码提供,而是由 dependency 组成,在单元测试您的产品时必须将其替换为 test double 码。 (对于需要执行ScheduledExecutorService实现的测试,可能有一个有效的设置,但这不是单元测试。)

因此,如果您要编写单元测试(而不是诸如集成测试的其他某种测试,而恰巧是使用 JUnit框架),则应该使用 mocking框架(例如Mockito等)为ScheduledExecutorService界面创建 mock ,并验证您的代码在模型上调用所需的方法。

要启用此验证的测试,您应该将ScheduledExecutorService接口的实现注入到您的代码中(最好通过constructor injection),并且不要在单元下测试本身,以便您拥有 seam ,在这里可以交换ScheduledExecutorService接口的真实实现,并进行模拟以进行单元测试。

相关问题