gpt4 book ai didi

android - 模拟改造可观察到的错误

转载 作者:太空宇宙 更新时间:2023-11-03 13:45:41 26 4
gpt4 key购买 nike

我正在使用 Mockito 来测试 Presenter 功能。我构建了一些假 API 响应并成功测试了它们。

但是当我想从 Observable 调用 OnError 时,它没有被调用。

我在一个名为 ApiCalls.java 的类中有这个函数:

public Observable<List<Person>> getPeople(String location)
{
Retrofit retrofit = new Retrofit.Builder()
.baseUrl(BASE_URL)
.addCallAdapterFactory(RxJavaCallAdapterFactory.create())
.addConverterFactory(GsonConverterFactory.create())
.build();

APIService service = retrofit.create(APIService .class);

return service.getPeople(location);
}

Presenter中的函数如下:

public void getPeople(final String location) {

Observable observable= apiCalls.getPeople(location);

observableResult.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Subscriber<List<Person>>() {
@Override
public void onCompleted() {

}

@Override
public void onError(Throwable e) {
Log.w("ON ERROR",e.getMessage());
view.showError("An error has occurred");

}

@Override
public void onNext(List<Person> people) {
view.refreshPeople(people);
}
});
}

然后,在单元测试中,我尝试这样做:

   when(apiCalls.getPeople("London"))
.thenReturn(Observable.error(new HttpException(buildResponse())));

presenter.getPeople("London");

verify(peopleView).showError(Mockito.anyString());

和 buildResponse:

public Response buildResponse()
{
String json = getJSONError();

Response response = Response.error(403, ResponseBody.create(MediaType.parse("application/json") ,json));
return response;
}

但是,当我测试时,出现以下消息错误:

Wanted but not invoked:
peopleView.showError(<any string>);
-> at com.lordwater.myapp.PeoplePresenterImpl.testError(PeoplePresenterTest.java:154)

编辑:在设置中我将调度程序设置为中间:

@Before
public void setUp() {

RxAndroidPlugins.getInstance().registerSchedulersHook(new RxAndroidSchedulersHook() {
@Override
public Scheduler getMainThreadScheduler() {
return Schedulers.immediate();
}
});

presenter = new PeoplePresenterImpl(peopleView);
}

@After
public void tearDown() {
RxAndroidPlugins.getInstance().reset();
}

最佳答案

您的问题是您没有在 RxJavaPlugins Hook 中覆盖 Schdeulers.io(),而只是覆盖 mainThread Scheduler:

@Override
public Scheduler getIOScheduler() {
return Schedulers.immediate();
}

正如您所说,在测试真正的异步调用时,您必须等待结果,否则测试将无结果,但网络操作本身仍然发生在单独的线程上,因此不会阻塞测试线程,并且测试结束,没有结果。

关于toBlocking()toBlocking()在你想观察结果时很有用(onNext()),这个会将您的 Obesrvable 转换为 BlockingObservable ,这有点类似于内存收集,这意味着您需要调用:

 apiCalls.getPeople("London")
.toBlocking()
.first();

这将阻塞直到有答案,然后你可以assertEquals这个结果。
但是您的场景在这里有所不同,您想要验证订阅者是否按预期使用 onError(),这意味着您也在测试订阅。

关于android - 模拟改造可观察到的错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42882367/

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