在 Optional 中使用 assertJ 断言值

a3d*_*fcv 9 java optional assertj

我有两个班级:

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());
} 

Run Code Online (Sandbox Code Playgroud)

我的测试:

public void testCLass() {
   Assertions.assertThat(getOptionalValue())
      .isPresent()
      .map(v -> v.inner.value)
      .isEqualTo("value");
}
   
Run Code Online (Sandbox Code Playgroud)

我希望它通过,因为isPresentunwraps 可选,map转换Outervalue最后一种方法,我只是比较字符串。

但它在最后一行失败并显示以下消息:

Expecting:
 <Optional[value]>
to be equal to:
 <"value">
but was not.
Run Code Online (Sandbox Code Playgroud)

我不知道为什么不展开可选

Sav*_*ior 19

javadoc forOptionalAssertmap方法说明

调用mapOptional测试,后来链断言在执行Optional从产生的map呼叫。

但是,isEqualTo实际上是比较整体的价值AbstractAssertOptionalAssert比较封闭的值不会被覆盖。AnOptionalAssert的值Optional本身不等于 a String

你会想要使用 hasValue

验证实际Optional值是否包含给定值( 的别名contains(Object))。

断言将通过:

assertThat(Optional.of("something")).hasValue("something");
assertThat(Optional.of(10)).contains(10);
Run Code Online (Sandbox Code Playgroud)

所以

Assertions.assertThat(getOptionalValue())
      .isPresent()
      .map(v -> v.inner.value)
      .hasValue("value");
Run Code Online (Sandbox Code Playgroud)

或者,因为hasValue实际上在isPresent内部执行检查,您可以使用

Assertions.assertThat(getOptionalValue())
      .map(v -> v.inner.value)
      .hasValue("value");
Run Code Online (Sandbox Code Playgroud)


YCF*_*F_L 4

您缺少一个步骤,您应该使用它get()来获取可选的值,因为在您的情况下,映射返回一个Optional<String>而不是字符串:

.map(v -> v.inner.getValue())
.get()
.isEqualTo("value");
Run Code Online (Sandbox Code Playgroud)

或者,如果您想坚持使用Optional,则应该与 进行比较Optional

.map(v -> v.inner.getValue())
.isEqualTo(Optional.of("value"));
Run Code Online (Sandbox Code Playgroud)