Как заставить MockWebServer работать?

Я разрабатываю приложение с использованием архитектуры MVP. Я пытаюсь проверить Interactors моего приложения с помощью MockWebServer. Ну, у меня есть этот тест:

@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() } } 

Но, когда я раскомментирую assertCompleted на TestSubscriber, я всегда получаю assertionError … Я знаю, что TestSubscriber работает, потому что я использую его в других тестах.

Вот мой ApiCall:

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

Мой 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() } } 

И мой базовый URL (Нет бэкэнд-сервера … может быть что угодно):

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

Итак, что мне не хватает? Этот код должен работать …

Любая помощь приветствуется!

РЕДАКТИРОВАТЬ:

Итак, я изменил код на это:

 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()) 

И это:

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

Но я все еще получаю эту ошибку:

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

    Здесь есть несколько вещей. Во-первых, MockWebServer.url() разрешает данный URL-адрес для базового url макет-сервера, он не устанавливает URL-адрес. Если вы хотите установить URL-адрес, вам нужно передать его методу start() . Как правило, вы настраиваете свою модификацию для вызова конечной точки сервера –

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

    Во-вторых, чтобы получить ответы от фальшивого веб-сервера, вам нужно задать ожидаемые ответы как MockResponse s. В противном случае он не знает, что отправить назад. Перед тем, как сделать свой запрос, сделайте следующее:

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

    Вам нужно будет построить ответ, чтобы отразить ожидаемый ответ.

    См. README для еще нескольких примеров.

    Interesting Posts

    Включение безопасности глобальной безопасности Spring Security нарушает инъекцию зависимостей (с Kotlin)

    Как составить nullables в Kotlin

    Есть ли способ ссылаться на класс Java для функции верхнего уровня Kotlin?

    Проблема с DJI SDK gradle 4.4.0, если ключевое слово в градле не работает

    Найти свойства с нулевым значением через отражение

    Завод Котлин на внутреннем вложенном классе

    Android: Дождитесь завершения нескольких задач

    Как получить текущую локальную дату и время в Котлин

    Как использовать выражение `with` от Kotlin для типов с нулевым значением

    Какое правильное место для запуска службы в архитектуре MVVM Android

    Котлин объясняет мне, что касается полей подкачки

    Пропустить, если он пуст в плагине Kotlin Maven

    Android studio конвертирует в Kotlin: используйте @JvmStatic в некоторых случаях

    Kotlin: Как получить группу захвата первой строки, которая соответствует?

    Серия Autosize ScatterChart

    Давайте будем гением компьютера.