RxJava Retrofit和mockito测试不起作用

时间:2018-04-18 19:27:38

标签: android mockito retrofit

我不知道为什么,但对于特定路线,它不起作用:

所需路线:

@POST("v2/current-time")
fun utc_time_from_server(): Observable<Response<Void>>

我的测试:

    @Test
    fun test_call_request_time_success_on_first_header_response() {

//        given
        var mockedResponse = Any()
        var millis = 1L


        server.enqueue(MockResponse()
                .addHeader("millis", millis)
                .setResponseCode(200)
                .setBody(""))

//        when
        doReturn(sharedPrefs).`when`(application).getSharedPreferences(any(), any())
        doReturn(Observable.just(mockedResponse)).`when`(api).utc_time_from_server()
        presenter.requestTimeSyncPeriodic()
        testScheduler.triggerActions()


//        then
        val calls = Mockito.inOrder(view, database, unbiasedClock)
        calls.verify(unbiasedClock).saveServerTime(1L, SystemClock.elapsedRealtime(), application)

    }

我的presenter方法名为requestTimeSyncPeriodic(该方法每隔一分钟从mainActivity计时器调用,只有一个用于测试purpouse)

  fun chainTimeRequests(): Observable<Long> {
        return apiBag.apiMirror1.utc_time_from_server()
                .flatMap { response -> if (response.isSuccessful && response.headers().get("millis") != null) { return@flatMap Observable.just(response) } else { return@flatMap  apiBag.apiMirror2.utc_time_from_server() } }
                .flatMap { response -> if (response.isSuccessful && response.headers().get("millis") != null) { return@flatMap Observable.just(response) } else { return@flatMap  apiBag.apiMainFast.utc_time_from_server() } }
                .flatMap { response -> if (response.isSuccessful && response.headers().get("millis") != null) { return@flatMap Observable.just(response.headers().get("millis")!!.toLong()) } else { throw TimeMillisOnHeaderNullException("") } }
    }

    fun requestTimeSyncPeriodic() {
                disposable.add(
                        chainTimeRequests()
                                .subscribeOn(scheduler.ui())
                                .observeOn(scheduler.ui())
                                .subscribe(
                                        { utcMillis ->
                                            unbiasedClock.saveServerTime(time = utcMillis, elapsedTime = SystemClock.elapsedRealtime(), application = application) },
                                        { error ->
                                            error.printStackTrace()
                                            view?.doNothing()
                                        }

                                )
                )
    }

我不知道为什么会给出这个结果:

java.lang.ClassCastException: java.lang.Object cannot be cast to retrofit2.Response

但是如果更改测试模拟api调用返回到任何其他相关的路径

像:

doReturn(Observable.just(mockedResponse)).`when`(api).call_any_other_route()
    presenter.requestTimeSyncPeriodic()

测试通过正确,我真的不明白为什么utc_time_from_server无法正常工作,

abr 18, 2018 4:24:27 PM okhttp3.mockwebserver.MockWebServer$2 execute INFO: MockWebServer[35751] starting to accept connections abr 18, 2018 4:24:30 PM okhttp3.mockwebserver.MockWebServer$3 processOneRequest INFO: MockWebServer[35751] received request: POST /v2/current-time HTTP/1.1 and responded: HTTP/1.1 200 OK

1 个答案:

答案 0 :(得分:0)

错误是使用doReturn响应(嘲笑模拟的响应并期望第一个被嘲笑为结果hahahah,令人困惑?是的)