org.mockito.exceptions.base.MockitoException:
ClassCastException occurred while creating the mockito mock :
...
You might experience classloading issues, please ask the mockito mailing-list.
MockWebServerは、例にあるように基本newしてMockResponseをenqueueしてurl(...)すればstartしてreturn valueにURL(http://localhost:XXXXX/←random port number)が入っているのでそれをRetrofitに食わせればいいのだけれども、URLをsetする部分はShadowの中なので、test classから直接食わせられず。なので固定port番号を使いたく、その場合server.url("/...");は不要で、
上記の話は、Retrofit2のService interfaceでObservable<...>を返す場合のもの。Call<...>を返す形にしてenqueue()してCallback<...>でonResponse()、onFailure()でhandleする場合には、こうは行かなかった(onResponse()もonFailure()も実行されない)。ShadowLooper.runUiThreadTasks()でうまく行くようなことを書いてある情報(Testing retrofit 2 with robolectric, callbacks not being called)もあったが、症状変わらず。OkHttpのMockWebServerとRobolectricでFragmentの動作をテストするにRetrofit2内で使っているOkHttpClient.Builder#newBuilderをshadowしてうまく行く話があったので、試すと確かにonResponse()が呼ばれた! ただ、今回ぼくは実classの方でnew Retrofit().newBuilder().client(new OkHttpClient().newBuilder().build())とかってclientmethodを使っておらずdefaultで裏でimplicitlyに生成されるOkHttpClientそのまま使っており、それだとnewBuilder()呼ばれないので、色々辿ってった挙句、okhttp3.Dispatcher#executorServiceをshadowして、前述のpageにあったようにすぐcommand.run()するexecutemethodを持つAbstractExecutorServiceclassを返してやると、うまく行った。Dispatcher#executorServiceってjava.util.concurrent.ThreadPoolExecutorをdefaultでは使っており、Androidのthreadとは違うから、uncontrollableだったんですね。考えてみるに、RxAndroidと違いRetrofitはAndroid専用ではないので、java.util.concurrentのExecutor使ってるのも当然ですか。