验证rxjava订阅者中的交互

Fre*_*red 3 android mockito rx-java

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

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

现在该类从视图中TheSubscriber调用onNext一个方法,例如:

@Override public void onNext(ReturnValue value) {
  view.displayWhatever(value);
}
Run Code Online (Sandbox Code Playgroud)

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

问题:

有干净的方法吗?

背景:

  • 我正在使用mockito验证交互,当然还有更多
  • Dagger正在注射整个主持人,除了 TheSubscriber

我试过了什么:

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

谢谢您的帮助

Ser*_*kyi 6

假设你正在使用接口,service并view以类似的方式:

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);
  }
}
Run Code Online (Sandbox Code Playgroud)

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

@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");
}
Run Code Online (Sandbox Code Playgroud)