簡體   English   中英

在 Optional 中使用 assertJ 斷言值

[英]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解包可選, mapOuter轉換為value ,在最后一種方法中我只是比較字符串。

但它在最后一行顯示消息失敗:

Expecting:
 <Optional[value]>
to be equal to:
 <"value">
but was not.

我不知道為什么沒有打開可選

OptionalAssertmap方法的 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());

簡單明了,是推薦的方式,如果OuterInner有合適的equals方法,你就不需要更多了。 雖然我自己沒有用 AssertJ 嘗試過,但我相信它在Optional為空的情況下和在某個級別持有不正確值的情況下都會給出明確的信息。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM