Mockwebserver And Retrofit With Callback
Solution 1:
By having a Callback
you are telling Retrofit to invoke the request and call the callback asynchronously. This means that your test is exiting before anything happens.
There are two ways to get this to work:
- Use a lock at the end of the test and wait until one of the callback methods are invoked.
- Pass an instance of a synchronous
Executor
(one that just calls.run()
immediately) tosetExecutors
on theRestAdapter.Builder
so that the background invocations and callback invocations happen synchronously.
Solution 2:
For retrofit 2 see the answer here: https://github.com/square/retrofit/issues/1259 You can supply the synchronous executor to an OkHttpClient (via its dispatcher) and set this client to the Retrofit.Builder. You can also set the same executor to the callbackExecutor.
For example:
CurrentThreadExecutorcurrentThreadExecutor=newCurrentThreadExecutor();
okhttp3.Dispatcherdispatcher=newokhttp3.Dispatcher(currentThreadExecutor);
OkHttpClientokHttpClient=newOkHttpClient.Builder().dispatcher(dispatcher).build();
newRetrofit.Builder()
.client(okHttpClient)
.baseUrl(httpUrl)
.addConverterFactory(JacksonConverterFactory.create())
.callbackExecutor(currentThreadExecutor)
.build();
Example of CurrentThreadExecutor implementation: https://gist.github.com/vladimir-bukhtoyarov/38d6b4b277d0a0cfb3af
Solution 3:
Alternatively you could use Mockinizer with MockWebServer:
OkHttpClient.Builder()
.addInterceptor(loggingInterceptor)
.mockinize(mocks) // <-- just add this line.build()
And the requests/responses that you want to mock you can define in the mocks
value. In your case it would look something like:
package com.appham.mockinizer.demo
import com.appham.mockinizer.RequestFilter
import okhttp3.mockwebserver.MockResponse
val mocks: Map<RequestFilter, MockResponse> = mapOf(
RequestFilter("/") to MockResponse().apply {
setResponseCode(200)
setBody("""{}""")
}
)
Post a Comment for "Mockwebserver And Retrofit With Callback"