Project Reactor onErrorMap 抛出的测试异常
Testing exception thrown by Project Reactor 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>
assertThrows<RuntimeException>
通过是因为 ErrorCallbackNotImplemented
扩展了 RuntimeException
。我想如果你进一步查看调试器,那里抛出的异常仍然是 ErrorCallbackNotImplemented
。我 - 认为 - 你想要做的是在你的 .subscribe 方法中添加一个错误子句,在那里你可能会得到你期望的异常,如果你愿意,你可以 re-throw 它。
如果您想测试发布者 (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()
}
我正在尝试捕获由 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>
assertThrows<RuntimeException>
通过是因为 ErrorCallbackNotImplemented
扩展了 RuntimeException
。我想如果你进一步查看调试器,那里抛出的异常仍然是 ErrorCallbackNotImplemented
。我 - 认为 - 你想要做的是在你的 .subscribe 方法中添加一个错误子句,在那里你可能会得到你期望的异常,如果你愿意,你可以 re-throw 它。
如果您想测试发布者 (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()
}