如何对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
相关产品推荐
相关产品推荐

