想象一下 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),那么我需要改变很多测试和代码。
- 模拟整个服务。这还不错,但需要我模拟很多方法,但我并没有完全达到我想要的效果。
- 在互联网上查了一下,但似乎没有人有一个干净直接的方法来做到这一点
感谢帮助
最佳答案
假设您以类似的方式使用service
和view
的接口(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/