gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 12:05:54 25 4
gpt4 key购买 nike

想象一下 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com