ScheduledThreadPoolExecutor 的单元测试

Unit Test for ScheduledThreadPoolExecutor

假设我有这样的方法

public void scheduleCleanup(String parameter) {
    final SomeObject someObject = new SomeObject(parameter);
    ScheduledThreadPoolExecutor executor = new ScheduledThreadPoolExecutor(1);
    executor.schedule((Runnable) () -> cleanupService.startCleanup(someObject),
                CLEANUP_TIMEOUT_SEC, TimeUnit.SECONDS);
}

这意味着 cleanupService.startCleanup(someObject)CLEANUP_TIMEOUT_SEC 之后被调用,这实际上来自某些属性文件。

对我来说很清楚,我可以创建 SomeObject 并为 cleanupService.startCleanup(someObject) 编写单元测试,但是我如何使用 scheduleCleanup 方法?

  1. 我想我需要模拟它,但在这种情况下你是怎么做到的?
  2. 是否可以避免模拟,在这种情况下最好的方法是什么?

我猜您想在单元测试中避免 using/calling ScheduledThreadPoolExecutor。我会用 ScheduledExecutorService 替换 ScheduledThreadPoolExecutor 并将其注入 class:

@Inject ExecutorService executor;

public void scheduleCleanup(String parameter) {
   final SomeObject someObject = new SomeObject(parameter);
   executor.schedule((Runnable) () -> cleanupService.startCleanup(someObject),
            CLEANUP_TIMEOUT_SEC, TimeUnit.SECONDS);
}

然后您可以简单地验证 executor.schedule(Runnable, long, TimeUnit) 在适当的地方被调用。