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
方法?
- 我想我需要模拟它,但在这种情况下你是怎么做到的?
- 是否可以避免模拟,在这种情况下最好的方法是什么?
我猜您想在单元测试中避免 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)
在适当的地方被调用。
假设我有这样的方法
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
方法?
- 我想我需要模拟它,但在这种情况下你是怎么做到的?
- 是否可以避免模拟,在这种情况下最好的方法是什么?
我猜您想在单元测试中避免 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)
在适当的地方被调用。