当前位置: 首页 > 知识库问答 >
问题:

在可选中使用assertJ断言值

戎桐
2023-03-14

我有两门课:

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外层转换为value,在最后一个方法中,我只是比较字符串。

但它在最后一行失败了:

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

我不知道为什么可选包装没有打开

共有3个答案

龚国源
2023-03-14

如果可以的话,直接在收到的文件上进行测试(可选),而不是将其拆开并测试三个级别。

    Assertions.assertThat(getOptionalValue()).hasValue(new Outer());

它清晰简单,是推荐的方法,如果外部内部有合适的equals方法,你就不需要更多了。虽然我自己还没有用AssertJ尝试过,但我相信它在可选为空的情况下,以及在某种程度上持有不正确的值的情况下,都会给出清晰的消息。

宰父淳
2023-03-14

如果缺少一个步骤,应该使用get()来获取可选的值,因为在您的示例中,map会返回一个可选的值

.map(v -> v.inner.getValue())
.get()
.isEqualTo("value");

或者,如果你想坚持使用可选的,你应该与可选的进行比较:

.map(v -> v.inner.getValue())
.isEqualTo(Optional.of("value"));

翟俊远
2023-03-14

javadoc forOptionalAssert的映射方法声明

在测试中的可选上调用map,之后链接的断言将在由map调用产生的可选上执行。

然而,isEqualTo实际上是将AbstractAssert的值作为一个整体进行比较。对于OptionalAssert,它不会被覆盖以比较所包含的值。可选断言的值,即可选本身,不等于字符串

您需要使用hasValue

验证实际的可选是否包含给定值(的别名包含(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");
 类似资料:
  • 我正在阅读使用Assertj验证结果的测试类。偶尔,我会发现一个没有断言的断言。 是否有可能在开发周期的某个地方识别这些类?我的第一个猜测是使用自定义声纳规则。虽然我不明白应该如何定义这个方法后面应该跟一个断言(返回void的方法?)。

  • 基本上,问题是是否有AssertJ(首选)或JUnit断言: 我的测试类(CUT)扩展了JAXB的。解组XML文件时,它应该保证相等的对象恰好存在一次。为了验证这一点,我的测试当前看起来是这样的(在示例中,标准ctor创建相等对象):

  • 使用Hamcrest可以很容易地否定匹配器。例如。您可以这样编写断言:

  • 但是我不知道如何使用AssertJ。我在网上看到的所有例子都使用带有Spring MVC测试的Hamcrest。 下面是一个使用Hamcrest API的示例。

  • null 编辑:一个附加的非功能性需求是,测试应该可以很容易地通过附加的约束来扩展。在Hamcrest中,表达附加约束是相当容易的,例如。 依赖于列表索引的测试必须重新编号。在本例中,使用自定义条件的测试必须重写完整的条件(请注意,中的约束不限于子字符串检查)。