我正在测试的课程有一些依赖关系。所有这些都提供setListener()
作为从其非阻塞操作接收通知的方式。
我实现了一种阻塞方法,该方法汇总了所有非阻塞操作的结果。这意味着我必须使用此类setListener()
方法注册侦听器,然后等待回调。
我应该如何在单元测试中模拟/伪造这些依赖关系?
我可以对它们进行子类化并实现setListener()
并根据需要触发回调。但是,我们可以说其中一些部门是final
类。另外,我认为Mockito可以使用某些功能吗?
概念代码(未经测试):
public void blockingMethod() {
CountDownLatch signal = new CountDownLatch(2);
dep1.setListener(new Dep1Listener() {
@Override public onResult(int result) {
signal.countDown();
}
});
dep1.calculateValue1();
dep2.setListener(new Dep2Listener() {
@Override public onResult(int result) {
signal.countDown();
}
});
dep2.calculateValue2();
signal.await();
return combinedResult;
}
最佳答案
我将创建返回固定值的依赖项的具体实现。我不会继承现有类,而是创建接口的最小实现。如果您没有为依赖项定义接口,请创建它们。
模拟可能会起作用,但测试将更难阅读。一旦模拟需要保留一个参数(即您的听众)并在以后对其进行处理,就变得很有挑战性。