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 个单独的部分,每种情况一个。那样干净多了
我正在使用 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 个单独的部分,每种情况一个。那样干净多了