[英]Assert value with assertJ in Optional
我有兩節課:
class Outer {
Inner inner = new Inner("value");
}
class Inner {
private final String value;
Inner(String value) {
this.value = value;
}
}
public Optional<Outer> getOptionalValue() {
return Optional.of(new Outer());
}
我的測試:
public void testCLass() {
Assertions.assertThat(getOptionalValue())
.isPresent()
.map(v -> v.inner.value)
.isEqualTo("value");
}
我希望它通過,因為isPresent
解包可選, map
將Outer
轉換為value
,在最后一種方法中我只是比較字符串。
但它在最后一行顯示消息失敗:
Expecting:
<Optional[value]>
to be equal to:
<"value">
but was not.
我不知道為什么沒有打開可選
OptionalAssert
的map方法的 javadoc 狀態
在被測試的
Optional
上調用map
,隨后鏈接的斷言在map
調用產生的Optional
上執行。
然而, isEqualTo
實際上是比較AbstractAssert
的值作為一個整體。 OptionalAssert
比較封閉的值不會被覆蓋。 OptionalAssert
的值,即Optional
本身,不等於String
。
你會想要使用hasValue
驗證實際
Optional
是否包含給定值(contains(Object)
的別名)。斷言將通過:
assertThat(Optional.of("something")).hasValue("something"); assertThat(Optional.of(10)).contains(10);
所以
Assertions.assertThat(getOptionalValue())
.isPresent()
.map(v -> v.inner.value)
.hasValue("value");
或者,因為hasValue
實際上在內部執行isPresent
檢查,所以您可以使用
Assertions.assertThat(getOptionalValue())
.map(v -> v.inner.value)
.hasValue("value");
您缺少一個步驟,您應該使用get()
來獲取 Optional 的值,因為 map 在您的情況下返回Optional<String>
而不是 String:
.map(v -> v.inner.getValue())
.get()
.isEqualTo("value");
或者,如果您想堅持使用Optional
,則應該與Optional
進行比較:
.map(v -> v.inner.getValue())
.isEqualTo(Optional.of("value"));
如果可以的話,直接在收到的Optional
上進行測試,而不是把它拆開並深入測試三個級別。
Assertions.assertThat(getOptionalValue()).hasValue(new Outer());
簡單明了,是推薦的方式,如果Outer
和Inner
有合適的equals
方法,你就不需要更多了。 雖然我自己沒有用 AssertJ 嘗試過,但我相信它在Optional
為空的情況下和在某個級別持有不正確值的情況下都會給出明確的信息。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.