gpt4 book ai didi

java - Mockito - RxJava 2 - 验证调用

转载 作者:行者123 更新时间:2023-11-30 00:08:46 25 4
gpt4 key购买 nike

是否可以使用 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"));
}
}

“方法 3”日志不会在生产代码中执行。

最佳答案

当您进行检测时,您需要使用与生产代码相同的方法来延迟返回值。

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

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

关于java - Mockito - RxJava 2 - 验证调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48523743/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com