【问题标题】:RxJava blockingFirst/Single returns wrong exception in JUnit 5 Retrofit TestRxJava blockingFirst/Single 在 JUnit 5 Retrofit 测试中返回错误异常
【发布时间】:2020-02-07 18:25:37
【问题描述】:

下面的测试预计会返回 HttpException,但它会返回 RuntimeException。

   @Test
    fun `Server down returns 500 error`() {

        mockWebServer.enqueue(MockResponse().setResponseCode(500))

        val exception: Exception =
            assertThrows(
                HttpException::class.java
            ) {

                githubApi
                    .getRepoList("test")
                    .blockingFirst()

            }

        assertEquals(exception, HttpException::class)

    }

测试失败的日志是

信息:MockWebServer[54339] 收到请求:GET /users/test/repos HTTP/1.1 并响应:HTTP/1.1 500 服务器错误 2020 年 2 月 7 日 9:20:11 PM okhttp3.mockwebserver.MockWebServer 接受连接信息: MockWebServer[54339] 已完成接受连接:套接字已于 2 月 7 日关闭, 2020 晚上 9:20:11 okhttp3.mockwebserver.MockWebServer$serveConnection$$inlined$execute$1 runOnce 信息:来自 /127.0.0.1 的 MockWebServer[54339] 连接失败: java.net.SocketException: 套接字关闭

org.opentest4j.AssertionFailedError: 抛出意外的异常类型 ==> 预期:com.jakewharton.retrofit2.adapter.rxjava2.HttpException 但是: java.lang.RuntimeException

【问题讨论】:

  • blockingFirst 将检查的异常包装到 RuntimeException 中,因此您必须提取原始异常作为其原因。
  • @akarnokd 非常感谢。您也可以将其发布为答案,以便我接受并投票吗?如果问题不大,您可以发布如何从原始异常中提取它吗?

标签: android rx-java2 junit5 mockwebserver


【解决方案1】:

正如@akarnokd 建议的那样,您需要找出原因。

assertEquals(exception.cause, HttpException::class)

或者,您也可以在没有blockingFirst 的情况下进行测试,如下所示:

githubApi
    .getRepoList("test")
    .test()
    .assertError(HttpException::class)

【讨论】:

  • 我实际上是这样做的,但我也想知道如何使用阻塞运算符来实现
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-07-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-03-09
  • 2018-09-23
  • 2011-01-28
相关资源
最近更新 更多