Java JUnit:测试对象不在列表中
在JUnit测试中,我需要测试给定对象(不是引用,而是对象的属性)是否不在列表中。最好的方法是什么?如果我正确理解了你的问题:Java JUnit:测试对象不在列表中,java,list,junit,Java,List,Junit,在JUnit测试中,我需要测试给定对象(不是引用,而是对象的属性)是否不在列表中。最好的方法是什么?如果我正确理解了你的问题: Object o =....; //some object assertFalse(list.contains(o)); 如果对象equals()方法已正确实现,则此方法可以工作。如果存储在列表中的对象实现equals以匹配这些属性,则或将给出答案 如果您的对象没有实现,那么这些方法将基于引用相等(而不是您想要的)进行应答。@Test 公共void testConta
Object o =....; //some object
assertFalse(list.contains(o));
如果对象
equals()
方法已正确实现,则此方法可以工作。如果存储在列表中的对象实现equals
以匹配这些属性,则或将给出答案
如果您的对象没有实现,那么这些方法将基于引用相等(而不是您想要的)进行应答。@Test
公共void testContains(){
String demoObject=“Testing!”;
//myList isa列表
assertFalse(“对象在集合中”,myList.contains(demoObject));
}
我假设执行简单的contains()检查不够深入?如果您已经重写了对象的equals()方法,则list.contains(o)可以工作。假设您使用的是当前版本的JUnit,最好的方法是为您类型的对象列表编写自己的匹配器
创建一个扩展org.hamcrest.TypeSafeMatcher
的类,并实现给定的方法。
为您的类添加一个静态构造函数方法,这样您就可以在assertThat
语句中轻松调用它,并移交一个不应包含的对象示例。
在matchessesafely()
方法中,确保列表中不包含与示例属性匹配的对象
或者,在对象上实现equals
,创建一个示例,然后执行以下操作
assertThat(yourList,而不是hasItem(yourSample))
,其中,not
是来自CoreMatchers
的静态导入,hasItem
是来自JUnitMatchers
的静态导入
当然,一旦实现了
equals
,就可以简单地assertFalse(yourList.contains(yourSample))代码>如果我理解您想要断言列表中某些对象的属性在某些方面不相等。。。。
如果可以使用commons集合(),则可以使用接口org.apache.commons.collections.Predicate在列表中搜索(使用方法org.apache.commons.collections.CollectionUtils.find(list,Predicate)
你可以做像这样的事情
Predicate p = new Predicate(){
/*
* Test if the object has the value that you don't want
*/
public boolean evaluate(java.lang.Object object){
YourObject yo = (YourObject) object;
return yo.getProperty().equals(theValue);
}
}
//if is return null means that nothing was found
assertNull(CollectionUtils.find(yourList, p));
谓词p=新谓词(){
/*
*测试对象是否具有您不想要的值
*/
公共布尔求值(java.lang.Object){
YourObject yo=(YourObject)object;
返回yo.getProperty().equals(值);
}
}
//if is return null表示未找到任何内容
assertNull(CollectionUtils.find(yourList,p));
请指定一个例子好吗?不是引用,而是属性??这意味着什么?@Sean Means不想测试x==y
(引用)相等,除非您重写Object.equals,否则您将得到相等。您能否解释不是引用而是对象属性对您意味着什么?如果您引用列表中的对象,一些答案可能会对您有所帮助(例如重写equals)没有回答问题:他想知道对象是否在列表中,而不是对象是否在列表中。他说需要测试对象是否在列表中,而不是是否在列表中。应该是assertFalse-他说不在列表中。我仍然建议使用assertThat方法,即使使用equals,因为失败时会有更好的错误消息。
Predicate p = new Predicate(){
/*
* Test if the object has the value that you don't want
*/
public boolean evaluate(java.lang.Object object){
YourObject yo = (YourObject) object;
return yo.getProperty().equals(theValue);
}
}
//if is return null means that nothing was found
assertNull(CollectionUtils.find(yourList, p));