我正在尝试学习如何使用.retry()
测试方法。
我有两个基本课程:
public class Foo {
private Bar bar;
public Foo(Bar bar) {
this.bar = bar;
}
public Completable execute() {
return Completable.fromAction(() -> System.out.println("first part of task"))
.andThen(bar.dangerousMethod()
.retry(10)
)
.andThen(Completable.fromAction(() -> System.out.println("sec part of task")));
}
}
public interface Bar {
Completable dangerousMethod();
}
现在我想模拟dangerousMethod
两次失败然后发出complete()
@Mock private Bar bar;
@InjectMocks private Foo foo;
@Test
public void test() throws Exception {
when(bar.dangerousMethod()).thenReturn(
error(new Exception()),
error(new Exception()),
complete()
);
foo.execute()
.test()
.assertComplete();
}
不幸的是它失败了:
由于任务的第一部分
java.lang.AssertionError:未完成(latch = 0,values = 0,errors = 1,completions = 0)
dangerousMethod()
逻辑,和.retry()
执行 10次,但运行只有一次。
如何以正确的方式使用Mockito测试.retry()
方法?
答案 0 :(得分:0)
你不应该测试这个方法,因为它不是你的代码的一部分,并且(我希望)由那些编写RxJava库的人进行了很好的测试。
但无论如何,如果你想测试你可以做到这一点:
将when语句替换为:
when(bar.dangerousMethod()).thenReturn(
Completable.defer(new Callable<CompletableSource>() {
boolean fail = true;
@Override
public CompletableSource call() throws Exception {
if(fail) {
fail = false;
return Completable.error(new Exception());
} else {
return Completable.complete();
}
}
}));