¿Cómo hacer que MockWebServer funcione?

Estoy desarrollando una aplicación utilizando la architecture MVP. Estoy intentando probar los interactianos de mi aplicación usando MockWebServer. Bueno, tengo esta testing:

@RunWith(RobolectricTestRunner::class) @Config(constants = BuildConfig::class, manifest = "src/main/AndroidManifest.xml", packageName = "br.com.simplepass.simplepassnew", sdk = intArrayOf(23)) class LoginInteractorImplTest { lateinit var mLoginInteractor : LoginInteractor lateinit var mServer: MockWebServer @Before fun setUp(){ mLoginInteractor = LoginInteractorImpl() mServer = MockWebServer() mServer.start() } @Test fun loginTest(){ mServer.url("http://192.168.0.10:8080/login") val testSubscriber = TestSubscriber.create<User>() mLoginInteractor.login("31991889992", "lala").subscribe(testSubscriber) testSubscriber.assertNoErrors() // testSubscriber.assertCompleted() } @After fun tearDown(){ mServer.shutdown() } } 

Pero cuando elimino el comentario de assertCompleted en TestSubscriber, siempre obtengo assertionError … Sé que TestSubscriber funciona, porque lo uso en otras testings.

Aquí está mi ApiCall:

 @GET("login") fun login() : Observable<User> 

Mi NetModule:

 @Module class NetModule(val mBaseUrl: String) { @Provides @Singleton fun provideHttpCache(application: Application): Cache { val cacheSize = 10 * 1024 * 1024 return Cache(application.cacheDir, cacheSize.toLong()) } @Provides @Singleton fun provideOkhttpClient(cache: Cache) : OkHttpClient { val client = OkHttpClient.Builder() val interceptor = HttpLoggingInterceptor() interceptor.level = HttpLoggingInterceptor.Level.BODY client.addInterceptor(interceptor) return client.cache(cache).build() } @Provides @Singleton fun provideRetrofit(okHttpClient: OkHttpClient): Retrofit { return Retrofit.Builder() .baseUrl(mBaseUrl) .addConverterFactory(GsonConverterFactory.create()) .addCallAdapterFactory(RxJavaCallAdapterFactory.create()) .client(okHttpClient) .build() } } 

Y mi URL base (no hay server de back-end … podría ser cualquier cosa):

 <string name="api_base_url">http://192.168.0.12:8080</string> 

Entonces, ¿Qué me estoy perdiendo? Este código debería estar funcionando …

Cualquier ayuda es bienvenida!

EDITAR:

Entonces, cambié el código a esto:

 mLoginInteractor = LoginInteractorImpl() mServer = MockWebServer() mServer.enqueue(MockResponse() .setResponseCode(200) .setBody(Gson().toJson(User(1, "991889992", "Leandro", "123")))) mServer.start() val client = OkHttpClient.Builder() val cacheSize = 10 * 1024 * 1024 client.cache(Cache(application.cacheDir, cacheSize.toLong())).build() mLoginInteractor.setRetrofit(Retrofit.Builder() .baseUrl(mServer.url("/")) .addConverterFactory(GsonConverterFactory.create()) .addCallAdapterFactory(RxJavaCallAdapterFactory.create()) .client(client.cache(Cache(application.cacheDir, cacheSize.toLong())).build()) .build()) 

Y esto:

 val testSubscriber = TestSubscriber.create<User>() mLoginInteractor.login("31991889992", "lala").subscribe(testSubscriber) testSubscriber.assertNoErrors() testSubscriber.assertReceivedOnNext(listOf(User(1, "991889992", "Leandro", "123"))) testSubscriber.assertCompleted() 

Pero sigo teniendo este error:

 Number of items does not match. Provided: 1 Actual: 0. Provided values: [User(id=1, phoneNumber=991889992, name=Leandro, password=123)] Actual values: [] 

Hay un par de cosas pasando aquí. Primero, MockWebServer.url() resuelve la url dada contra la url base del server simulado, no configura la url. Si desea configurar la url, deberá pasarla al método start() . En general, configura su modificación para llamar al punto final del server:

 Retrofit retrofit = new Retrofit.Builder() .baseUrl(server.url("/")) // Other builder methods. .build(); 

En segundo lugar, para get respuestas del server web simulado, debe poner en queue las respuestas esperadas como MockResponse . De lo contrario, no sabe qué enviar de vuelta. Haga algo como lo siguiente antes de hacer su pedido:

 server.enqueue(new MockResponse().setBody("Success!")); 

Deberá build su respuesta para reflejar la respuesta esperada.

Vea el file README para más ejemplos.