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

在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验证交互,当然还有更多
>除了TheSubscriber之外,Dagger正在注射整个演示者

我试过了什么:

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

谢谢您的帮助

解决方法:

假设您以类似的方式使用接口进行服务和查看:

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");
}
上一篇:java – 我可以使用mockito来匹配具有自动更新时间戳的对象吗?


下一篇:使用Mockito 2.0.7模拟lambda表达式