Исключение тестирования, выдаваемое Project Reactor onErrorMap - PullRequest
0 голосов
/ 16 мая 2019

Я пытаюсь проверить перехват исключения (kotlin.Exception), выданного Mono, которое затем перехватывается, и выдается новое исключение (MyException).

Сбой следующего фрагмента ...

class MyException : Exception("My Exception")
assertThrows<MyException> {
     Mono.fromCallable { throw Exception() }
         .onErrorMap { MyException() }
         .subscribe()
}

... со следующей ошибкой:

org.opentest4j.AssertionFailedError: Unexpected exception type thrown ==> 
Expected :<com.company.project.service.SomeServiceTest$foobar$MyException> 
Actual   :<reactor.core.Exceptions.ErrorCallbackNotImplemented>

однако следующие проходы

assertThrows<RuntimeException> {
    Mono.fromCallable { throw Exception() }
        .onErrorMap { RuntimeException() }
        .subscribe()
}

и я не уверен почему. За исключением того, что я использую пользовательское исключение, я не вижу разницы.

Я также пытался использовать block(), с похожими результатами:

class MyException : Exception("My Exception")
assertThrows<MyException> {
    Mono.fromCallable { throw Exception() }
            .onErrorMap { MyException() }
            .block()
}

другое исключение:

org.opentest4j.AssertionFailedError: Unexpected exception type thrown ==> 
Expected :<com.company.project.service.SomeServiceTest$foobar$MyException> 
Actual   :<reactor.core.Exceptions.ReactiveException>

Ответы [ 2 ]

1 голос
/ 18 мая 2019

Если вы хотите протестировать Publisher (Mono / Flux), вы должны использовать StepVerifier .Не забывайте, что когда вы используете метод подписки, он не блокирует поток.Это может привести к тому, что ваш тест может иногда проходить, а иногда нет, потому что тестовый (основной) поток может завершиться до того, как ваш тестовый поток (Mono) будет выполнен.

class MyException : Exception("My Exception")

@Test
fun `correct exception mapping`() {
    val theMonoWeWantToTest = Mono
        .fromCallable { throw Exception() }
        .onErrorMap { MyException() }

    theMonoWeWantToTest
        .test() // Kotlin's extension function for Reactor's StepVerifier
        .expectError(MyException::class.java)
        .verify()
}
1 голос
/ 17 мая 2019

assertThrows<RuntimeException> проходит, потому что ErrorCallbackNotImplemented расширяется RuntimeException. Я думаю, что если вы посмотрите дальше в отладчике, исключение, которое выдается там, все равно ErrorCallbackNotImplemented. Я думаю, что вы хотели бы сделать, это добавить предложение об ошибке в ваш метод .subscribe, и там вы, скорее всего, получите ожидаемое исключение, и вы можете перезапустить его, если хотите.

...