Как заставить 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>

Мой сетевой модуль:

@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: []

person Leandro Borges Ferreira    schedule 28.12.2016    source источник
comment
Вы решили свою проблему?   -  person Dr.jacky    schedule 03.02.2019


Ответы (1)


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

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

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

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

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

Дополнительные примеры см. в README.

person iagreen    schedule 29.12.2016
comment
Спасибо за ответ iagreen. Я попробую это. - person Leandro Borges Ferreira; 29.12.2016
comment
Я сделал точно так, как вы написали, но все равно не повезло. - person Leandro Borges Ferreira; 29.12.2016