Mockito - RxJava 2 - 验证调用

时间:2018-01-30 14:26:24

标签: java android mockito rx-java2

是否可以使用Mockito验证可观察量的调用?

我的用例类:

public class Foo {

    private Bar bar;

    public Foo(Bar bar) {
        this.bar = bar;
    }

    Completable execute() {
        return bar.method1()
                .andThen(bar.method2())
                .andThen(bar.method3());
    }
}

我的依赖班:

interface Bar {
    Completable method1();
    Completable method2();
    Completable method3();
}

现在我的测试课:

@Mock private Bar bar;
@InjectMocks private Foo foo;

@Test
public void test() throws Exception {
    when(bar.method1()).thenReturn(complete());
    when(bar.method2()).thenReturn(error(new Exception()));
    when(bar.method3()).thenReturn(complete());

    foo.execute()
            .test()
            .assertError(Exception.class);

    verify(bar, times(1)).method1();
    verify(bar, times(1)).method2();
    verify(bar, times(1)).method3(); // <-- this is important part
}

不幸的是,这传递了,我知道为什么。但我想检查是否调用了可观察方法的主体。例如,如果Bar的实现是:

public class BarImplementation implements Bar {

    @Override
    public Completable method1() {
        return Completable.fromAction(() -> System.out.println("method 1"));
    }

    @Override
    public Completable method2() {
        return Completable.error(new Exception());
    }

    @Override
    public Completable method3() {
        return Completable.fromAction(() -> System.out.println("method 3"));
    }
}

&#34;方法3&#34;日志不会在生产代码中执行。

1 个答案:

答案 0 :(得分:1)

执行检测时,需要使用相同的方法将返回值作为生产代码延迟。

AtomicBoolean m3Run = new AtomicBoolean(false);
...
when(bar.method3()).thenReturn(Completable.fromAction(() -> m3Run.set(true));

然后,您的测试可以检查m3Run的值是否为false,因为除非订阅,否则不会运行完整版。