Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/377.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/visual-studio-2008/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java JUnit:测试对象不在列表中_Java_List_Junit - Fatal编程技术网

Java JUnit:测试对象不在列表中

Java JUnit:测试对象不在列表中,java,list,junit,Java,List,Junit,在JUnit测试中,我需要测试给定对象(不是引用,而是对象的属性)是否不在列表中。最好的方法是什么?如果我正确理解了你的问题: Object o =....; //some object assertFalse(list.contains(o)); 如果对象equals()方法已正确实现,则此方法可以工作。如果存储在列表中的对象实现equals以匹配这些属性,则或将给出答案 如果您的对象没有实现,那么这些方法将基于引用相等(而不是您想要的)进行应答。@Test 公共void testConta

在JUnit测试中,我需要测试给定对象(不是引用,而是对象的属性)是否不在列表中。最好的方法是什么?

如果我正确理解了你的问题:

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));