java - 在 Optional 中使用 assertJ 断言值

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

我的测试:
public void testCLass() {
   Assertions.assertThat(getOptionalValue())
      .isPresent()
      .map(v -> v.inner.value)
      .isEqualTo("value");
}
   
我希望它会通过,因为 isPresent展开 optional ,map转换 Outer进入 value在最后一种方法中,我只是比较字符串。
但它在最后一行显示消息失败:
Expecting:
 <Optional[value]>
to be equal to:
 <"value">
but was not.
我不知道为什么没有打开 optional

最佳答案

OptionalAssert 的 javadoc的map方法状态

Call map on the Optional under test, assertions chained afterwards are performed on the Optional resulting from the map call.


但是, isEqualTo 实际上是比较 AbstractAssert 的值作为一个整体。它不会被 OptionalAssert 覆盖比较封闭的值。一个 OptionalAssert的值,Optional本身,不等于 String .
你会想要使用 hasValue

Verifies that the actual Optional contains the given value (alias of contains(Object)).

Assertion will pass :

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");

关于java - 在 Optional 中使用 assertJ 断言值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62563313/

相关文章:

java - 调整主框架大小时 JPanel 窗口不缩放

ruby-on-rails - 如何使我的belongs_to 字段 optional ?

ant - 在哪里可以找到丢失的 optional Ant 任务?

java - AssertJ:使用 String.format 生成的消息测试异常

java - AssertJ的 `usingComparatorForFields`是如何工作的?

java - Apache 使用 Spring Security 重定向到 Tomcat 应用程序

java - 在 1 个类中运行 2 个以上线程

twig:仅当变量存在时才显示变量

intellij-idea - 在 IntelliJ IDEA 中运行测试时出现 java.lang.NoSuchMethodError

Java 二维字符串数组 : find column where all elements are the same