私はMockitoを使用してプレゼンターの機能をテストしています。私はいくつかの偽のAPIレスポンスを構築しており、正常にテストしました。モックretrofit観察可能なエラー
しかし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);
}
プレゼンター内の関数は以下の通りです:
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)
EDITを:私はInmediateにスケジューラを設定し、セットアップで:
@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();
}
スケジューラを即時に変更するには、テストセットアップで何かを行っていますか?そうでなければ、おそらくスレッドの問題です。 – Jahnold
@Jahnold私はそれが問題だと思う。 '.observeOn'がスケジューラを切り替える可能性があり、テストスレッドは待機しません。 –
@ TassosBassoukos私のエディションでは、SetUpでMainThreadSchedulerをInmediateに設定しました。それでも問題が.observeOnの場合、Observerを待機するためにテストスレッドをどのように作成できますか? – LordWater