【发布时间】:2021-06-22 16:54:48
【问题描述】:
我每分钟调用一次服务。我正在尝试编写一个单元测试来检查调度程序是否继续调用可运行对象,即使调用抛出异常也是如此。 已经有一个测试用例确认在可运行对象中捕获的异常没有冒泡。
class ServiceRunner {
@NonNull
private final Service service;
@NonNull
private final ScheduledExecutorService scheduler;
@Inject
public ServiceRunner(final Service service) {
this(service, Executors.newSingleThreadScheduledExecutor());
}
public void run() {
scheduler.scheduleAtFixedRate(this::runService, 0, 1, TimeUnit.MINUTES);
}
@VisibleForTesting
void runService() {
try {
service.run();
} catch {
log.info("Exception");
}
} }
到目前为止,我尝试创建一个模拟调度程序和一个调度程序对象。 两种方法都适用
verify(service).run();
但是
verify(service, times(2)).run();
失败并显示仅调用一次的消息。
两者都只调用一次可运行方法,然后在单元测试中终止。 我不明白为什么调度程序在测试时不工作。
请建议如何为此用例编写测试用例。
【问题讨论】:
-
您的测试是否有睡眠等待 2 分钟才能验证?
-
添加睡眠 2 分钟有效。能够捕获 service.run() 的多个调用。谢谢你的建议。你能解释一下为什么这里需要睡觉吗?
-
在理想的单元测试中,您不需要验证
service.run已被scheduler调用了多少次,因为此时您正在尝试测试scheduler是否有效或不是。您应该测试的是,当您调用ServiceRunner.run时,它是否调用了调度程序上带有相关参数的相关方法。您可以通过注入调度程序的模拟/间谍实例来做到这一点。单元测试框架/库代码是当您最终进行长时间运行的无意义测试时
标签: java unit-testing mockito guice scheduledexecutorservice