我试图理解为什么添加equalTo会使我的测试失败。 我用一个简单的类和测试重新创建了这个问题。
第一个测试通过,第二个测试失败。
示例类
public class Class {
Map<String, Boolean> data = new HashMap<>();
public Map<String, Boolean> getData(boolean access) {
if (!access)
return null;
return data;
}}
测试类
public class ClassTest {
@InjectMocks
private Class testObj;
@Test
public void testGetDataNull() {
assertThat(testObj.getData(false), is(nullValue()));
}
@Test
public void testGetDataNull2() {
assertThat(testObj.getData(false), is(equalTo(nullValue())));
}}
失败的测试显示此错误消息
Expected: is <null>
but: was null
问:它们之间有什么区别?
任何见解都非常感谢!
这是因为nullValue()
返回一个org.hamcrest.core.isNull
对象。所以它不等于null
,它是一个对象。然而,该对象包含一个只匹配null
的matches
方法,这就是is
工作的原因。
顺便说一句,测试可能应该只是阅读assertNull(testObj.getData(false))
你的问题实际上是关于Hamcrest的,而不是Mockito。
您正在测试实际值,即testObj.getData(false)
,即null
,等于nullValue()
返回的值, 是 IsNull() 匹配器的实例。IsNull 的实例不等于null
,因此失败。
我建议避免使用Hamcrest,在我看来,Hamcrest更难正确使用,也不如AssertJ优雅。
使用AssertJ,你会写
assertThat(testObj.getData(false)).isNull();
不再有静态方法可以猜测,而是有效的自动完成流畅断言。