我正在尝试测试捕获由 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()
}
不同的异常(exception):
org.opentest4j.AssertionFailedError: Unexpected exception type thrown ==>
Expected :<com.company.project.service.SomeServiceTest$foobar$MyException>
Actual :<reactor.core.Exceptions.ReactiveException>
最佳答案
如果你想测试一个发布者(Mono/Flux),你应该使用 StepVerifier .不要忘记,当您使用 subscribe 方法时,它不会阻塞线程。这可能导致您的测试有时可以通过,有时无法通过,因为测试(主)线程可以在您的测试流(单声道)完成之前终止。
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()
}
关于kotlin - Project Reactor onErrorMap 抛出的测试异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56171334/