android - 验证 rxjava 订阅者中的交互

标签 android mockito rx-java

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

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

现在 TheSubscriber 类从 View 调用 onNext 方法,比如:

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

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

问题:

有没有一种干净的方法来做到这一点?

背景:

  • 我正在使用 mockito 来验证交互,当然还有更多
  • Dagger 正在注入(inject)除 TheSubscriber 之外的整个演示者

我尝试了什么:

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

感谢帮助

最佳答案

假设您以类似的方式使用serviceview 的接口(interface):

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");
}

关于android - 验证 rxjava 订阅者中的交互,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31411917/

相关文章:

JUnit:无法模拟 RestTemplate 对象来调用 postForObject 方法

java - 在 Spring 3 中创建单元测试

java - Mockito.spy 验证错误 : Constructor must call super() or this()

android - RxJava repeatWhen 在 Mockito 中不再调用

android - Observable 运行在主线程上的 onNext 中接收到的 Runnables,项目之间存在延迟

来自 URL 的 Android google mapv2 图标

java - 使用不同的源代码创建多个 APK

spring - 订阅 Mono 时将 Disposable 存储在数据库中

android - 同时输入两个编辑文本字段

java - 如何通过点击生成新 Activity