验证rxjava订阅者中的交互

时间:2015-07-14 16:10:54

标签: android mockito rx-java

以MVP模式描述您的演示者订阅返回观察者的服务的情况:

public void gatherData(){
   service.doSomeMagic()
      .observeOn(Schedulers.io())
      .subscribeOn(AndroidSchedulers.mainThread())
      .subscribe(new TheSubscriber());
}

现在,班级TheSubscriber从视图中调用onNext方法,例如:

@Override public void onNext(ReturnValue value) {
  view.displayWhatever(value);
}

现在,在我的单元测试中,我想验证当在非错误情况下调用方法gatherData()时,将调用视图的方法displayWhatever(value)

问题

有干净的方法吗?

背景

  • 我使用mockito来验证互动,当然还有更多内容
  • Dagger正在注射除TheSubscriber
  • 之外的整个演示者

我尝试了什么

  • 注入订阅者并在测试中模拟它。看起来有点脏,因为如果我想改变演示者与服务交互的方式(说不是Rx)那么我需要改变很多测试和代码。
  • 模拟整个服务。这并不是那么糟糕,但要求我嘲笑很多方法,而且我没有达到我想要的效果。
  • 在互联网上查看,但似乎没有人能够直接做到这一点

感谢您的帮助

1 个答案:

答案 0 :(得分:2)

我知道它已经很晚但可能对某人有所帮助,因为我很长时间搜索了你的问题:D

对我来说,最后添加 void gatherData() { service.doSomeMagic() .compose(getSchedulerTransformer()) .subscribe(view::displayValue); } private <T> Observable.Transformer<T, T> getSchedulerTransformer() { if (mTransformer == null) { mTransformer = (Observable.Transformer<T, T>) observable -> observable.subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()); } return mTransformer; } void setSchedulerTransformer(Observable.Transformer<Observable<?>, Observable<?>> transformer) { mTransformer = transformer; } 如下:

setSchedulerTransformer(observable -> {
            if (observable instanceof Observable) {
                Observable observable1 = (Observable) observable;
                return observable1.subscribeOn(Schedulers.immediate())
                        .observeOn(Schedulers.immediate());
            }
            return null;
        });

设置Transformer只是我刚刚通过了这个:

@Before

因此,只需在测试中添加presenter.setSchedulerTransformer方法并调用dict comprehension,它应该能够对此进行测试:)

希望这有所帮助,并且在某种程度上可以理解:D