Java jUnit和Guava,比较transform()后的列表相等性

Java jUnit和Guava,比较transform()后的列表相等性,java,junit,guava,Java,Junit,Guava,在jUnit测试中,我希望根据name列从数据库中获取一些行。然后我想测试我得到的行是否具有我期望的名称。我有以下资料: Set<MyClass> typesToGet = MyClassFactory.createInstances("furniture", "audio equipment"); Collection<String> namesToGet = Collections2.transform(typesToGet, new NameFunc

在jUnit测试中,我希望根据
name
列从数据库中获取一些行。然后我想测试我得到的行是否具有我期望的名称。我有以下资料:

Set<MyClass> typesToGet = MyClassFactory.createInstances("furniture",
    "audio equipment");
Collection<String> namesToGet = Collections2.transform(typesToGet,
    new NameFunction<MyClass, String>());
List<MyClass> typesGotten = _svc.getAllByName(typesToGet);
assertThat(typesGotten.size(), is(typesToGet.size()));
Collection<String> namesGotten = Collections2.transform(typesGotten,
    new NameFunction<ItemType, String>());
assertEquals(namesToGet, namesGotten); // fails here

您可以使用
containsAll()
两次来检查是否有任何缺失值或任何意外值

assertTrue(namesToGet.containsAll(namesGotten));
assertTrue(namesGotten.containsAll(namesToGet));

但是,如果您决定使用
列表
设置
而不是
集合
,则接口契约指定一个
列表
等于另一个
列表
()

比较指定对象与此列表是否相等。返回
true
当且仅当指定的对象也是列表时,两个列表的大小相同,并且两个列表中所有对应的元素对相等。(如果
(e1==null?e2==null:e1.equals(e2))
,则两个元素e1和e2是相等的)换句话说,如果两个列表以相同的顺序包含相同的元素,则将它们定义为相等。此定义确保equals方法在
列表
接口的不同实现中正常工作


资源:


如果您希望它们包含相同的元素,但不一定以相同的顺序,那么只需对它们进行
ImmutableSet
复制,并检查这些集合是否相等。如果您希望它们具有相同的顺序,则执行
ImmutableList
复制并检查它们是否相等


集合
实际上根本没有任何平等的概念。

编写此类断言最简洁、最具表现力的方式是使用Hamcrest matcher:

assertThat(namesGotten, containsInAnyOrder(namesToGet))

番石榴有一种方法,我发现它很好地传达了你想要得到的概念:。如果symmetricDifference为空,则集合相等

assetTrue(Sets.symmetricDifference(namesToGet, namesGotten).isEmpty());
但是,它可能不是“最便宜的”,因为它执行并集、交集和差分操作。您还可以检查这些集合的大小是否相同。如果它们不相同,则它们不包含相同的元素,如果是,则可以验证(非对称)是否为空

assertEquals(namesToGet.size(), namesGotten.size());
assertTrue(Sets.difference(namesToGet, namesGotten));

我想我找到了上描述的
包含任何订单
,但我没有看到关于它的文档。您知道它是否确认了两个集合的大小相同,集合1中只有集合2中的项目,集合2中只有集合1中的项目?Hamcrest文档在这方面有点缺乏,因此,值得尝试一些匹配者,让自己相信他们做的是正确的事情。或者,源代码位于。是的,它检查集合1是否包含集合2的所有元素,反之亦然,因此它们的大小相同。
assertEquals(namesToGet.size(), namesGotten.size());
assertTrue(Sets.difference(namesToGet, namesGotten));