Android ApplicationをRobolectricでtestしていて、 どうにも困ったのでメモです。
状況は、Android Applicationで、 Robolectricを使っていて、 Retrofit2でPOSTしにいく部分(受け手はMockWebServer)のunit testで、 突然NullPointerExceptionになってsubscribeのerrorに入ってしまう、というもの。 breakpointで追っていってもcall()で突如NPEに入ってしまって、 具体的にどこでNPEに陥っているのかよく分かりませんでした。 Googleで探してみると、 Stack Overflowにそれらしき投稿があり、 .observeOn(AndroidSchedulers.mainThread())は LooperSchedulerなのでここでNPEになる、 だからRxAndroidPluginsのregisterSchedulersHook()で Schedulers.immediate()してやると良い、 と書いてあって、やったー! と思ったものの、効果なく。
結局そうではなくて、 MockWebServer使っているからhttp://localhost:NNNN/...に requestを改装しているせいなんですけど、 SecurityPolicy絡みのExceptionが裏で出ているようで、 以下のようなShadowを用意して@Config({shadows=...})に 書いてやればそのままですんなり行きました。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | |
勿論、.subscribeOn(Schedulers.io())に対しては RxJavaHooks.setOnIOScheduler(s -> Schedulers.immediate()); した上で、です。