kotlin - Project Reactor onErrorMap 抛出的测试异常

标签 kotlin project-reactor

我正在尝试测试捕获由 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/

相关文章:

android - ViewModelProviders 无法在我的 fragment 中工作

java - 将上下文从一个通量/单声道传递到另一个

java - 等待ParallelFlux完成

android - 如何增加 Android 上的 Kotlin 协程 Dispatchers.IO 大小?

java - Gridview View 高度未包裹所有水平项目

java - LibGDX:Kotlin 与 Java

android - 提高 for each 循环的性能,每个循环都有一个内部 for each 循环

java - 阻塞式 Spring Data 和响应式 Spring Data 之间的区别?

java - 如何将请求对象转换为Spring Webflux模型

project-reactor - Reactor Flux - 仅在完成时从 Publisher 发出