【问题标题】:How to verify exception thrown using StepVerifier in project reactor如何在项目反应器中使用 StepVerifier 验证抛出的异常
【发布时间】:2020-02-18 21:37:38
【问题描述】:
    def expectError() {

        StepVerifier.create(readDB())
                    .expectError(RuntimeException.class)
                    .verify();
    }

     private Mono<String> readDB() {
//        try {
            return Mono.just(externalService.get())
                    .onErrorResume(throwable -> Mono.error(throwable));

//        } catch (Exception e) {
//            return Mono.error(e);
//        }
    }

如果 externalService.get 抛出异常而不是返回 Mono.error,则无法使其工作。是否始终建议使用 try catch 转换为 Mono/Flow,或者是否有更好的方法来验证此类抛出的异常?

【问题讨论】:

    标签: spring-webflux project-reactor reactive


    【解决方案1】:

    大多数情况下,如果用户提供的引发异常的代码以 lambda 形式提供,则异常可以转换为 onError。但是这里你直接扔进主线程,所以这不会发生

    【讨论】:

    • 所以我的理解是,如果实现在我们的控制之下,永远不要抛出这样的异常,尤其是在主线程中,如果我们正在使用可能抛出异常的外部服务,请始终尝试/捕获并转换为 onError以便它可以继续在管道上流动。对吗?
    • 这里你甚至没有创建 Flux 或 mono,在有机会这样做之前抛出异常
    • 我稍微修改了 sn-p 以反映问题。但正如您在回答中建议的那样,如果我设法通过 lambda 调用 externalService 如下,我发现它也可以。所以这是推荐的解决方案吗? return Mono.just("hello") .map(s -> get()) .onErrorResume(throwable -> Mono.error(throwable));
    • 在某种程度上。您可以使用Mono.fromCallable 避免奇怪的just+map。但是如果 get() 方法被阻塞,这里有一个潜在的反模式,请参阅 projectreactor.io/docs/core/snapshot/reference/…
    • (注意:仅在 Reactor-Core >= 3.3.3.RELEASE 上使用常见问题解答中建议的Schedulers.boundedElastic()。否则使用Schedulers.elastic()
    猜你喜欢
    • 2010-10-21
    • 2019-12-13
    • 2013-06-29
    • 1970-01-01
    • 1970-01-01
    • 2020-08-29
    • 2011-06-02
    • 2020-05-08
    相关资源
    最近更新 更多