2016-12-15 179 views
0

我想了解为什么添加等于正在使我的测试失败。 我用一个简单的类和测试重新创建了这个问题。JUnit Mockito测试失败与等于

第一次测试通过,第二次测试失败。

样例类

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 

Q中的测试:什么是它们之间的区别?

任何有识之士都非常感谢!

+0

我的猜测是,在第二次测试中,您实际上是在检查_getData(false)_的结果是否等于由_nullValue()_生成的Matcher对象。尝试使用* null *代替。 –

+0

请不要将您的班级命名为“班级”。这会导致你所有的问题。 – nasukkin

回答

0

这是因为nullValue()返回一个org.hamcrest.core.isNull对象。所以它不等于null,它是一个对象。但是,该对象包含一个matches方法,该方法只能匹配null,这就是为什么is有效。

顺便说一句,这个测试应该可能只是读assertNull(testObj.getData(false))

0

你的问题其实是关于Hamcrest,不是的Mockito。

你正在测试,如果实际值,即testObj.getData(false),这是null,等于由nullValue()返回的值,这是ISNULL()匹配的一个实例。 IsNull的一个实例不等于null,因此失败。

我建议避免Hamcrest,在我看来,它更难以正确使用,并且比AssertJ更不优雅。

随着AssertJ,你会写

assertThat(testObj.getData(false)).isNull(); 

没有静态方法来猜测了,并且有效自动完成流畅的断言来代替。