RxJava测试Observable

时间:2016-10-18 11:04:40

标签: java unit-testing testing rx-java reactive-programming

TestSubscriber之类的东西。它有非常有用的功能,如awaitTerminalEvent()getOnNextEvents()等。

TestSubscriber的{​​{1}}是否等同于可能被固定在序列中间的某些可观察对象?

我想测试一些特定的案例,其中一个是:

  • 我有一个在构造函数中接受Observable的类。其中一个方法调用Observable运算符中的Observable。因此,在特定条件下执行主onErrorResumeNext可能会调用经过测试的Observable。需要Observable之类的东西。

  • 在上述情况下,我想测试assertExecuted执行Thread

  • 我想知道Observable基于它的输入返回了什么。

每个案例都需要解决方法,如:

Observable

如果没有好的方法,如何使呼叫更清洁?

1 个答案:

答案 0 :(得分:1)

断言需要在作为observable一部分的lambda之外进行测试,因为lambdas本身可能永远不会运行(就像你的onErrorResumeNext情况一样)。所以你需要在observable之外定义一些对象来携带我们想要测试的结果。

测试可观察对象的常用技巧是使用Atomic对象来记录事件:

AtomicBoolean executed = new AtomicBoolean(false);
Observable
  .empty()
  .doOnNext(t -> executed.set(true))
  .subscribe();
assertFalse(executed.get());

使用TestSubscriber可以更好地完成此示例,但它显示了该技术。

rxjava-extras如果你使用的是java 6(heck只是使用retrolambda),那么就有了便利类,这样你就不需要为这个用例编写匿名类了:

AtomicBoolean executed = new AtomicBoolean(false);
Observable
  .empty()
  .doOnNext(Actions.setToTrue(executed))
  .subscribe();
assertFalse(executed.get());