java - 单元测试 - 验证 Observable 是否被订阅

标签 java unit-testing mockito rx-java observable

我有这样的java代码

 mDataManager.getObservable("hello").subscribe( subscriber );

我想验证下面的 Observable 正在 .subscribe()

我已经尝试模拟 getObservable()verify

 Observable<Response> res = mock(Observable.class);
 when(mDataManager.getObservable("hello")).thenReturn(res);
 verify(res).subscribe();

但是有错误

Caused by: java.lang.IllegalStateException: onSubscribe function can not be null.
at rx.Observable.subscribe(Observable.java:8167)
at rx.Observable.subscribe(Observable.java:8158)
at rx.Observable.subscribe(Observable.java:7962)
....
Caused by: rx.exceptions.OnErrorThrowable$OnNextValue: OnError while emitting onNext value: omni.neo.hk.omniapiservice.v4.model.external.UserLoginBean.class
at rx.exceptions.OnErrorThrowable.addValueAsLastCause(OnErrorThrowable.java:109)
at rx.exceptions.Exceptions.throwOrReport(Exceptions.java:187)
at rx.internal.operators.OperatorDoOnEach$1.onNext(OperatorDoOnEach.java:82)
... 48 more

我认为这里不可能mock一个Observable,但是没有一个mocked Observable我不能verify(res).subscribe()

在这种情况下有什么建议吗?

最佳答案

我发现RxJava提供了一个类叫TestSubject

你可以这样创建它

private TestScheduler eventsScheduler = new TestScheduler();
private TestSubject<MyEvent> eventObservable = TestSubject.create(eventsScheduler);

这将为您提供返回 boolean 值的方法 hasObservers()

@Test
public void testSubscription(){
    myTestClass.init(eventObservable);

    assertTrue(eventObservable.hasObservers());
}

此外,TestSubject 还允许您完美地确定何时应该发送事件。

eventObservable.onNext(new MyEvent());
eventsScheduler.triggerActions(); 

关于java - 单元测试 - 验证 Observable 是否被订阅,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40500312/

相关文章:

python - 为 Flask 应用程序单元测试设置(模拟)请求 header

java - 需要解释 : Generic friendliness to avoid casting, 这在 Java 8 中不再需要

java - 如何使用 PowerMock 和 Mockito 对 Files.java 中的 newDirectoryStream 进行部分模拟?

java - 制作可执行jar文件

java - 跨不同类加载器覆盖默认访问器方法会破坏多态性

java - 查找图像中的隐藏文件(视频文件)

java - 单元测试,我应该修改方法参数吗

java - 如何在JAVA中访问COM端口

java - .ParameterResolutionException : No ParameterResolver registered for parameter [jUnit 5 Tests]

java - 方法 `isEqualToComparingFieldByFieldRecursively` 的模拟