Mockito - 安排使用RxJava 2 .retry()

时间:2018-01-31 10:43:57

标签: java android mockito junit4

我正在尝试学习如何使用.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()方法?

1 个答案:

答案 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();
                        }
                    }
                }));