我有一个正在测试的类,其中包含一个具有内部匿名类的方法。匿名类中的方法之一调用被测类中的方法,但 Mockito 似乎没有意识到这一点。
public class ClassUnderTest {
Dependency dependency;
public ClassUnderTest(Dependency d) {
dependency = d;
}
public void method() {
dependency.returnsObservable().observeOn(AndroidSchedulers.mainThread())
.subscribeOn(Schedulers.io()).subscribe(new Observer<SupportClass> {
/* Other methods omitted */
public void onComplete() {
outerMethod();
})
}
public void outerMethod() {
blah;
}
}
我的测试代码:
public class TestClass {
ClassUnderTest underTest;
Dependency dependency;
@Before
public void setUp() throws Exception {
dependency = Mockito.mock(Dependency.class);
underTest = Mockito.spy(new ClassUnderTest(dependency));
}
@Test
public void method() throws
Mockito.when(dependency.returnObservable()).thenReturn(Observable.just(new SupportClass());
Mockito.doNothing().when(underTest).outerMethod();
underTest.method();
Mockito.verify(underTest).outerMethod();
}
}
由于某种我似乎无法弄清楚的原因,Mockito 无法检测到 outerMethod() 正在被调用,即使我已经通过在调试器中逐行进行手动验证。我还验证了对依赖项对象的调用返回了具有正确内容的正确可观察值,并且 onComplete() 和 outerMethod() 方法确实被调用。我只是很困惑为什么 Mockito 没有检测到它。
这是它吐出的错误:
Wanted but not invoked:
classUnderTest.outerMethod();
-> at (file and line number)
However, there was exactly 1 interaction with this mock:
classUnderTest.method();
-> at (file and line number)
我有什么明显遗漏的吗?
您正在调度程序之间进行更改,因此在测试时可能会导致一些问题(您的代码可能会达到verify
method before实际方法被调用
Check 本文 https://medium.com/@fabioCollini/testing-asynchronous-rxjava-code-using-mockito-8ad831a16877解释如何使用 RxJava 和 Mockito 测试异步代码
TL;DR
Add a TestRule
将所有调度程序设置为trampoline
所以它的行为是同步的:
public class TrampolineSchedulerRule implements TestRule {
@Override
public Statement apply(final Statement base, Description d) {
return new Statement() {
@Override
public void evaluate() throws Throwable {
RxJavaPlugins.setIoSchedulerHandler(
scheduler -> Schedulers.trampoline());
RxJavaPlugins.setComputationSchedulerHandler(
scheduler -> Schedulers.trampoline());
RxJavaPlugins.setNewThreadSchedulerHandler(
scheduler -> Schedulers.trampoline());
RxAndroidPlugins.setInitMainThreadSchedulerHandler(
scheduler -> Schedulers.trampoline());
try {
base.evaluate();
} finally {
RxJavaPlugins.reset();
RxAndroidPlugins.reset();
}
}
};
}
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)