MockWebServer and Retrofit with Callback

后端 未结 3 1879
伪装坚强ぢ
伪装坚强ぢ 2021-02-05 20:04

I would like to simulate network communication by MockWebServer. Unfortulatelly retrofit callbacks are never invoking. My code:

    MockWebServer server = new M         


        
相关标签:
3条回答
  • 2021-02-05 20:40

    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) to setExecutors on the RestAdapter.Builder so that the background invocations and callback invocations happen synchronously.
    0 讨论(0)
  • 2021-02-05 20:42

    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("""{}""")
        }
    
    )
    

    See https://github.com/donfuxx/Mockinizer

    0 讨论(0)
  • 2021-02-05 20:49

    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:

    CurrentThreadExecutor currentThreadExecutor = new CurrentThreadExecutor();
    okhttp3.Dispatcher dispatcher = new okhttp3.Dispatcher(currentThreadExecutor);
    OkHttpClient okHttpClient = new 
    OkHttpClient.Builder().dispatcher(dispatcher).build();
    
    new Retrofit.Builder()
            .client(okHttpClient)
            .baseUrl(httpUrl)
            .addConverterFactory(JacksonConverterFactory.create())
            .callbackExecutor(currentThreadExecutor)
            .build();
    

    Example of CurrentThreadExecutor implementation: https://gist.github.com/vladimir-bukhtoyarov/38d6b4b277d0a0cfb3af

    0 讨论(0)
提交回复
热议问题