测试异常由项目反应器Onerrormap抛出



我正在尝试通过Mono抛出的异常(kotlin.Exception(的测试,然后被捕获,并引发了新的异常(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>

如果要测试发布者(单/通量(,则应使用Stepverifier。不要忘记,当您使用订阅方法时,它不会阻止线程。这可能导致您的测试有时会通过,有时不是因为测试(主(线程可以在测试流(单声道(之前终止。

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()
}

assertThrows<RuntimeException>通过,因为ErrorCallbackNotImplemented扩展了RuntimeException。我认为,如果您在调试器中进一步看,那么在其中抛出的例外仍然是ErrorCallbackNotImplemented。我 - 思考 - 您想做的是在.subscriber方法中添加一个错误子句,在那里您可能会得到您期望的例外,如果需要的话,您可以重新启动。

最新更新