RxJava blockingFirst/Single возвращает неправильное исключение в тесте модернизации JUnit 5

Ожидается, что приведенный ниже тест вернет 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 Ошибка сервера 07 февраля 2020 г. 21:20:11 okhttp3.mockwebserver.MockWebServer acceptConnections INFO: MockWebServer[54339] завершен прием соединений: сокет закрыт 07 февраля 2020 г. 21:20:11 okhttp3.mockwebserver.MockWebServer$serveConnection$$inlined$execute$1 runOnce INFO: соединение MockWebServer[54339] с /127.0.0.1 не удалось: java.net.SocketException: Розетка закрыта

org.opentest4j.AssertionFailedError: выброшен непредвиденный тип исключения ==> ожидается: com.jakewharton.retrofit2.adapter.rxjava2.HttpException, но было: java.lang.RuntimeException


person Thracian    schedule 07.02.2020    source источник
comment
blockingFirst оборачивает проверенные исключения в RuntimeException, поэтому вам нужно извлечь исходное исключение в качестве его причины.   -  person akarnokd    schedule 07.02.2020
comment
@akarnokd Большое спасибо. Можете ли вы также опубликовать это как ответ, чтобы я мог принять и проголосовать? Если это не проблема, можете ли вы опубликовать, как извлечь его из исходного исключения?   -  person Thracian    schedule 08.02.2020


Ответы (1)


Как предполагает @akarnokd, вам нужно выяснить причину.

assertEquals(exception.cause, HttpException::class)

в качестве альтернативы вы также можете проверить это без blockingFirst следующим образом:

githubApi
    .getRepoList("test")
    .test()
    .assertError(HttpException::class)
person LordRaydenMK    schedule 08.02.2020
comment
На самом деле мне это нравится, но я также задавался вопросом, как я могу это сделать с блокирующими операторами. - person Thracian; 08.02.2020