我正在使用OptionalAssert
AssertJ 類,我需要實作一個 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.
uj5u.com熱心網友回復:
您可以改用布爾斷言
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
uj5u.com熱心網友回復:
你可以簡單地像這樣測驗:
@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 個獨立的測驗,每個案例一個。干凈多了
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/368174.html