AssertJ如何在ParameterizedTest中动态校验Optional是否存在/为空
AssertJ 动态校验Optional存在性的流式实现方案
- 方案1:使用原生
matches方法(无需额外开发,适配简单场景)
直接调用AssertJ内置的匹配方法,不需要自定义任何扩展,就能保留流式写法:
@ParameterizedTest @MethodSource(/* 你的参数源 */) void test_presence(Optional<String> opt, boolean present) { assertThat(opt) .matches(o -> present == o.isPresent(), present ? "期望Optional有值" : "期望Optional为空") // 若present为true,继续链式调用值校验逻辑;若为false建议在此结束链式调用,避免空值校验报错 .satisfies(o -> { if (present) { assertThat(o) .hasValueSatisfying(val -> /* 你的值校验逻辑1 */) .hasValueSatisfying(val -> /* 你的值校验逻辑2 */); } }); }
校验失败时会输出你自定义的描述信息,可读性和原生API一致。
- 方案2:自定义AssertJ断言扩展(完全符合要求的API风格,一劳永逸)
AssertJ原生支持自定义断言扩展,你可以自己封装带布尔入参的isPresent方法,完全适配你要的写法:
- 首先定义自定义Optional断言类:
import org.assertj.core.api.OptionalAssert; import java.util.Optional; public class CustomOptionalAssert<T> extends OptionalAssert<T> { public CustomOptionalAssert(Optional<T> actual) { super(actual); } // 自定义入口方法 public static <T> CustomOptionalAssert<T> assertThat(Optional<T> actual) { return new CustomOptionalAssert<>(actual); } // 你需要的动态存在性校验方法 public CustomOptionalAssert<T> isPresent(boolean expected) { if (expected) { isPresent(); } else { isEmpty(); } return this; } }
- 测试类静态导入你自定义的
assertThat方法,即可直接使用目标写法:
import static com.yourpackage.CustomOptionalAssert.assertThat; // 测试代码 @ParameterizedTest @MethodSource(/* 你的参数源 */) void test_presence(Optional<String> opt, boolean present) { assertThat(opt) .isPresent(present) // present为true时后续值校验正常执行;present为false时上一步已经抛出断言错误,不会走到后续逻辑 .hasValueSatisfying(val -> /* 你的值校验逻辑1 */) .hasValueSatisfying(val -> /* 你的值校验逻辑2 */); }
如果有其他动态校验需求,也可以直接在这个自定义类里扩展对应方法。
- 方案3:使用
Condition预定义校验条件
如果不想每次写matches的lambda,也可以提前预定义好条件常量复用:
// 提前定义全局复用的校验条件 private static final Condition<Optional<?>> IS_PRESENT = new Condition<>(Optional::isPresent, "有值"); private static final Condition<Optional<?>> IS_EMPTY = new Condition<>(Optional::isEmpty, "为空"); // 测试代码 assertThat(opt) .is(present ? IS_PRESENT : IS_EMPTY) // 后续校验逻辑同上
内容的提问来源于stack exchange,提问作者davioooh
相关产品推荐
相关产品推荐

