当前位置: 首页 > 知识库问答 >
问题:

验证rxjava订阅服务器中的交互

乌骏
2023-03-14

想象一下MVP模式中的情况,演示者订阅了一个返回观察者的服务:

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

现在,类subscriber从视图中调用onNext方法,比如:

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

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

问题是:

有没有干净的方法可以做到这一点?

背景:

  • 我使用mockito来验证交互,当然还有更多
  • Dagger正在注入整个演示者,除了TheSubcriber

我试过什么:

  • 注入订阅服务器并在测试中模拟它。看起来有点脏,因为如果我想改变演示者与服务交互的方式(比如说不是Rx),那么我需要更改很多测试和代码

谢谢你的帮助

共有2个答案

柯立果
2023-03-14

我知道现在已经很晚了,但希望它能帮助一些人,因为我一直在寻找你问题的答案: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;
        });

所以只需在测试中添加一个@前方法,并调用presenter.setSchedulerTransform,它应该能够测试这个:)

希望这能有所帮助,并且可以理解:D

欧阳高昂
2023-03-14

假设您正在以类似的方式使用服务视图的接口:

class Presenter{
  Service service;
  View view;

  Presenter(Service service){
    this.service = service;
  }

  void bindView(View view){
    this.view = view;
  }

  void gatherData(){
    service.doSomeMagic()
      .observeOn(Schedulers.io())
      .subscribeOn(AndroidSchedulers.mainThread())
      .subscribe(view::displayValue);
  }
}

然后可以提供模拟来控制和验证行为:

@Test void assert_that_displayValue_is_called(){
  Service service = mock(Service.class);
  View view = mock(View.class);
  when(service.doSomeMagic()).thenReturn(Observable.just("myvalue"));
  Presenter presenter = new Presenter(service);
  presenter.bindView(view);

  presenter.gatherData();

  verify(view).displayValue("myvalue");
}
 类似资料:
  • 第一,我试过了 第二,我尝试了下面的。(使用onErrorResumeNext),但取消了订阅。 (未调用onError,但调用OnComplete。因此已取消订阅) 第三,我试了下面。(带重试) 这比第一好。但没有刻录。 我想使刷新按钮,工作后错误。 我想知道 null 对不起,我的英语太差了。

  • 在我的项目中,我执行了很多网络请求(使用和),这些请求作为响应返回一个自定义的响应超类型,它可以由有效响应或错误响应组成。 错误代码不是HTTP错误代码,而是通过使用解析结果检索到的内容。大约有4-5个错误代码对所有网络请求都是相同的,例如会话超时。因此,我将编写一个泛型方法,检查所有响应中的错误代码,并设置对策,如请求一个新会话。 首先,我考虑使用拦截器,但因为我需要将结果解析为正确的格式,所以

  • 我将在一个Android应用程序中用替换模式。我有事件来提醒任何感兴趣的方面我的缓存中的数据更新单例。任何时候调用web服务,都将更新数据,并通过发布的事件向订阅者发出警报。 我在RxJava中使用设置了与此类似的内容。观察者从subject获得单个事件,但随后获得事件并取消订阅。这在UI第一次加载时起作用,但当需要刷新数据时,不会通知订阅者。如何告诉这些继续监听下一个事件?

  • 我有一个使用ActiveMQ的JMS生产者/订阅者的简单Spring应用程序,配置如下: 我试过所有可能的解决办法,但没有一个奏效。我们非常感谢任何帮助

  • 我正在尝试使用spring-integration-kafka-2.1.0。在我公司的项目中发布。但是,由于下面列出的例外情况,它不起作用:org。springframework。信息。MessageDeliveryException:Dispatcher没有频道“org”的订户。springframework。网状物上下文WebApplicationContext:/order。“奥Kafka”

  • 我在spring中有一个服务,它需要使用十种不同的方法获取数据。 我希望这些方法并行执行,以执行一些DB操作并返回到父线程。但是父线程应该等到所有响应出现,然后返回响应。 在我当前的方法中,我使用反应式mono异步执行所有方法,但主线程不等待订阅者方法完成。 下面是我订阅的两种方法 下面是我的主要方法 以下是我的输出: 我的输出显示,主线程没有等待订阅服务器完成其任务,因此我如何处理这种情况?