模拟具有 setListener(...) 的依赖项
Mocking dependency that has setListener(...)
我的 class 测试中有一些依赖项。所有这些都提供 setListener()
作为从其非阻塞操作接收通知的方式。
我实现了一个阻塞方法,它聚合了所有非阻塞操作的结果。这意味着我必须使用这样的 setListener()
方法注册监听器,并等待回调。
我应该如何 mock/fake 我的单元测试中的这些依赖项?
我可以子 class 它们并实现 setListener()
并根据需要触发回调。但是假设其中一些部门是 final
class。另外,我认为 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;
}
我会创建 return 固定值的依赖项的具体实现。我不会将现有的 类 子类化,而是创建您的接口的最小实现。如果您没有为依赖项定义接口,请创建它们。
模拟可能有效,但测试会更难阅读。一旦 mock 需要坚持一个论点(即你的听众)并在以后用它做一些事情,它就变得具有挑战性。
我的 class 测试中有一些依赖项。所有这些都提供 setListener()
作为从其非阻塞操作接收通知的方式。
我实现了一个阻塞方法,它聚合了所有非阻塞操作的结果。这意味着我必须使用这样的 setListener()
方法注册监听器,并等待回调。
我应该如何 mock/fake 我的单元测试中的这些依赖项?
我可以子 class 它们并实现 setListener()
并根据需要触发回调。但是假设其中一些部门是 final
class。另外,我认为 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;
}
我会创建 return 固定值的依赖项的具体实现。我不会将现有的 类 子类化,而是创建您的接口的最小实现。如果您没有为依赖项定义接口,请创建它们。
模拟可能有效,但测试会更难阅读。一旦 mock 需要坚持一个论点(即你的听众)并在以后用它做一些事情,它就变得具有挑战性。