You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何对Mono执行软断言并保留所有断言错误?

解决Reactor Mono属性的软断言兼容问题

问题核心是StepVerifier的verifyComplete()属于硬断言,一旦失败会直接抛出异常,中断AssertJ软断言的错误收集流程。要实现所有断言错误都被保留,需要将StepVerifier的断言结果纳入软断言管理体系,以下是两种可行方案:

方案一:使用Reactor官方集成方法verifyThenAssertThat

Reactor的StepVerifier提供了verifyThenAssertThat()方法,它会将验证结果包装为AssertJ可识别的断言对象,直接交给软断言处理,无需手动捕获异常,是最优雅的实现方式。

import org.junit.jupiter.api.Test;
import reactor.core.publisher.Mono;
import reactor.test.StepVerifier;

import static org.assertj.core.api.SoftAssertions.assertSoftly;

public class SoftAssertionTest {

    @Test
    void testSoftAssertion() {
        Mono<String> stringMono = Mono.just("some value");
        SomeObject someObject = new SomeObject(42, stringMono);
        
        assertSoftly(soft -> {
            // 普通属性的软断言
            soft.assertThat(someObject.anInt()).isEqualTo(24);
            
            // 将StepVerifier的断言逻辑纳入软断言
            StepVerifier.create(someObject.stringMono())
                    .expectNext("wrong_value") // 故意设置错误预期
                    .verifyThenAssertThat()
                    .satisfies(soft::assertThat);
        });
    }

    record SomeObject(int anInt, Mono<String> stringMono) {}
}

方案二:手动捕获断言异常并加入软断言

如果需要自定义错误信息,或者使用较旧版本的Reactor(无verifyThenAssertThat方法),可以手动捕获StepVerifier抛出的AssertionError,并将错误信息添加到软断言中。

import org.junit.jupiter.api.Test;
import reactor.core.publisher.Mono;
import reactor.test.StepVerifier;

import static org.assertj.core.api.SoftAssertions.assertSoftly;

public class SoftAssertionTest {

    @Test
    void testSoftAssertion() {
        Mono<String> stringMono = Mono.just("some value");
        SomeObject someObject = new SomeObject(42, stringMono);
        
        assertSoftly(soft -> {
            soft.assertThat(someObject.anInt()).isEqualTo(24);
            
            try {
                StepVerifier.create(someObject.stringMono())
                        .expectNext("wrong_value") // 故意设置错误预期
                        .verifyComplete();
            } catch (AssertionError e) {
                // 将Mono断言失败信息加入软断言
                soft.fail("Mono属性验证失败: " + e.getMessage());
            }
        });
    }

    record SomeObject(int anInt, Mono<String> stringMono) {}
}

效果说明

两种方案都能保证:无论普通属性断言还是Mono属性断言是否失败,所有错误都会被软断言收集,测试结束后一次性展示所有失败信息,不会因单个硬断言失败而中断其他验证逻辑。

内容的提问来源于stack exchange,提问作者Sergey Zolotarev

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.12 23:28:23