测试Project Reactor onErrorMap引发的异常

时间:2019-05-16 14:51:46

标签: 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()
}

不同的异常:

org.opentest4j.AssertionFailedError: Unexpected exception type thrown ==> 
Expected :<com.company.project.service.SomeServiceTest$foobar$MyException> 
Actual   :<reactor.core.Exceptions.ReactiveException>

2 个答案:

答案 0 :(得分:1)

assertThrows<RuntimeException>通过是因为ErrorCallbackNotImplemented扩展了RuntimeException。我认为,如果您进一步看一下调试器,那里抛出的异常仍然是ErrorCallbackNotImplemented。我想,您想要做的是在.subscribe方法中添加一个error子句,在那里您可能会得到所期望的异常,并且可以根据需要重新抛出它。

答案 1 :(得分:1)

如果要测试发布服务器(单声道/流量),则应使用StepVerifier。不要忘记,当您使用subscription方法时,它不会阻塞线程。这可能导致您的测试有时可以通过,有时却无法通过,因为test(main)线程可以在测试流(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()
}