kotlin - 测试 Project Reactor onErrorMap 抛出的异常
问题描述
我正在尝试测试捕获kotlin.Exception
由 a 抛出的异常 () 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>
解决方案
如果你想测试一个 Publisher (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()
}
推荐阅读
- angular - 在 Nginx 服务器上部署 Node API 和 Angular App
- css - 阻止 React 导入尚未使用的 CSS 文件
- datetime - 将 Series 中的对象类型转换为日期时间格式
- node.js - 通过代理连接到信号器 HUB - nodejs
- oracle-apex - Oracle Apex 将数据插入 OCI 存储桶
- swift - 如何正确使用不方便的 SCNGeometrySource 初始化程序?
- google-sheets - 具有取决于 countif 的过滤器和索引值的数组公式
- r - 我如何计算每行组内的观察值?
- java - fxml 的 javafx getResources 始终返回 null
- ruby-on-rails - 如何查询Notified gem json 字段