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