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转换Outer为value最后一种方法,我只是比较字符串。
但它在最后一行失败并显示以下消息:
Expecting:
<Optional[value]>
to be equal to:
<"value">
but was not.
Run Code Online (Sandbox Code Playgroud)
我不知道为什么不展开可选
Sav*_*ior 19
javadoc forOptionalAssert的map方法说明
调用
map的Optional测试,后来链断言在执行Optional从产生的map呼叫。
但是,isEqualTo实际上是比较整体的价值AbstractAssert。OptionalAssert比较封闭的值不会被覆盖。AnOptionalAssert的值Optional本身不等于 a String。
你会想要使用 hasValue
验证实际
Optional值是否包含给定值( 的别名contains(Object))。断言将通过:
Run Code Online (Sandbox Code Playgroud)assertThat(Optional.of("something")).hasValue("something"); assertThat(Optional.of(10)).contains(10);
所以
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)
您缺少一个步骤,您应该使用它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)
| 归档时间: |
|
| 查看次数: |
4576 次 |
| 最近记录: |