AssertJ 动态检查 Optinal 是否为空或存在

AssertJ dynamically check if Optinal is empty or present

我正在使用 AssertJ 的 OptionalAssert class,我需要实现一个 JUnit ParameterizedTest,它将以动态方式检查 Optional 实例是否存在:

@ParameterizedTest
@MethodSource(/* values */)
void test_presence(Optional<String> opt, boolean empty) {
    assertThat(opt) // -> .isPresent() / .isEmpty();
}

在非参数化测试中,我会使用 .isPresent().isEmpty() 方法来执行检查,但在这种情况下,我想应用类似 .isPresent(true/false) 的方法。

我在 JavaDoc 中找不到这样的方法,所以我想知道是否有替代方法(或者我应该只处理 if/else?)

更新 我知道我可以实现类似的东西(如答案中所建议的):

assertThat(opt.isPresent()).isEqualTo(present);

但我想保持流畅的方法,代码类似于:

assertThat(opt)
    .isPresent(present) // true/false
    .hasValueSatisfying(...)
    .hasValueSatisfying(...)
    // etc.

您可以改用布尔断言

assertThat(opt.isEmpty()).isEqualTo(empty)

您可以使用两个断言而不是一个,但是为了流畅断言,您可以使用 org.assertj.core.api.Condition.

  @ParameterizedTest
  @MethodSource("t")
  public void test(boolean empty, Object obj) {
    Condition<Optional<Object>> condition = new Condition<>(empty ? Optional::isEmpty : Optional::isPresent,
        "empty=%s", empty);
    assertThat(Optional.ofNullable(obj)).is(condition);
  }

  public static Stream<Arguments> t() {
    return Stream.of(Arguments.of(false, new Object()), Arguments.of(true, null), Arguments.of(true, new Object()));
  }

断言错误时显示以下消息

java.lang.AssertionError: 
Expecting:
  Optional[java.lang.Object@28bdbe88]
to be empty=true

您可以像这样简单地测试:

@ParameterizedTest
@ValueSource(/* values */)
void test_presence(Optional<String> opt, boolean present) {
    assertIsPresent(opt, present)
        .hasValueSatisfying(/* condition */)
        .hasValueSatisfying(/* condition */);
        // ...
}

private OptionalAssert<String> assertIsPresent(Optional<String> opt, boolean present) {
    return present ? assertThat(opt).isPresent() : assertThat(opt).isEmpty();
}

但是,如果您对何时存在值或不存在值有单独的逻辑,我建议您将测试分成 2 个单独的部分,每种情况一个。那样干净多了