使用 hamcrest 验证可选的最佳实践

UmA*_*orn 5 java testing android unit-testing guava

该测试不起作用

assertThat(bundle.getMyObj(), equalTo(Optional.absent()));
Run Code Online (Sandbox Code Playgroud)

一开始我只是使用一个普通的对象。(尚未使用可选<>)

private MyObj myObj;
Run Code Online (Sandbox Code Playgroud)

测试将如下所示

assertThat(myBundle.getMyObj(), nullValue());
Run Code Online (Sandbox Code Playgroud)

我将 myObj 更改为

private Optional<MyObj> myObj = Optional.absent();
Run Code Online (Sandbox Code Playgroud)

然后我将测试更改为

assertThat(bundle.getTracking(), equalTo(Optional.absent()));
Run Code Online (Sandbox Code Playgroud)

然后我得到一个错误

java.lang.AssertionError: 
Expected: <Optional.absent()>
     but: was <Optional.of(com.my.package.MyObj@2a9627bc)>
Expected :<Optional.absent()>

Actual   :<Optional.of(com.my.package.MyObj@2a9627bc)>
Run Code Online (Sandbox Code Playgroud)

我也尝试了下面的代码,但出现编译错误

assertThat(myBundle.getMyObj(), equalTo(Optional.of(MyObj)));
Run Code Online (Sandbox Code Playgroud)

Bye*_*Bye 2

这条信息:

java.lang.AssertionError: 
Expected: <Optional.absent()>
but: was <Optional.of(com.my.package.MyObj@2a9627bc)>
Expected :<Optional.absent()>
Actual   :<Optional.of(com.my.package.MyObj@2a9627bc)>
Run Code Online (Sandbox Code Playgroud)

表示你的Optional对象不为空。似乎bundle.getTracking()返回非空可选。

另外,如果您想检查测试中的可选项是否为空,我建议您使用 method isPresent()

而不是assertThat(bundle.getTracking(), equalTo(Optional.absent()))仅仅使用assertTrue(bundle.getTracking().isPresent())