我有两门课:
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.
我不知道为什么可选包装没有打开
如果可以的话,直接在收到的文件上进行测试(可选),而不是将其拆开并测试三个级别。
Assertions.assertThat(getOptionalValue()).hasValue(new Outer());
它清晰简单,是推荐的方法,如果
外部
和内部
有合适的equals
方法,你就不需要更多了。虽然我自己还没有用AssertJ尝试过,但我相信它在可选
为空的情况下,以及在某种程度上持有不正确的值的情况下,都会给出清晰的消息。
如果缺少一个步骤,应该使用get()
来获取可选的值,因为在您的示例中,map会返回一个可选的值
.map(v -> v.inner.getValue())
.get()
.isEqualTo("value");
或者,如果你想坚持使用
可选的
,你应该与可选的
进行比较:
.map(v -> v.inner.getValue())
.isEqualTo(Optional.of("value"));
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中,表达附加约束是相当容易的,例如。 依赖于列表索引的测试必须重新编号。在本例中,使用自定义条件的测试必须重写完整的条件(请注意,中的约束不限于子字符串检查)。