7

在 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

我目前遇到此故障:

java.lang.AssertionError:预期:com.google.common.collect.Collections2$TransformedCollection<[音频设备,家具]>,但原为:com.google.common.collect.Collections2$TransformedCollection<[音频设备,家具]>

那么,什么是最简洁、最简洁的方法来测试我从数据库中取回的行是否name与我说的我想要的名称相匹配?我可以有一个for循环遍历并检查一个列表中的每个名称是否存在于另一个列表中,但我希望更简洁。类似以下伪代码的东西会很好:

List<MyClass> typesGotten = ...;
["furniture", "audio equipment"].equals(typesGotten.map(type => type.getName()))
4

4 回答 4

15

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

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

但是,如果您决定使用ListorSet来代替Collection,接口协定指定 aList等于另一个List相同的Set当且仅当两者包含相同的值

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


资源:

于 2012-04-09T22:09:21.580 回答
6

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

Collection根本没有任何平等的概念。

于 2012-04-09T22:23:57.357 回答
6

编写这样一个断言的最简洁和最有表现力的方式是使用 Hamcrest 匹配器:

assertThat(namesGotten, containsInAnyOrder(namesToGet))
于 2012-04-10T18:03:51.687 回答
3

Guava 有一种方法,我发现它可以很好地传达您想要获得的概念:symmetricDifference。如果 symmetricDifference 为空,则集合相等。

assetTrue(Sets.symmetricDifference(namesToGet, namesGotten).isEmpty());

然而,它可能不是“最便宜的”,因为它执行并集、交集和差分操作。您还可以检查集合的大小是否相同——如果不是,它们不包含相同的元素,如果是,您可以验证(不对称)差异是否为空。

assertEquals(namesToGet.size(), namesGotten.size());
assertTrue(Sets.difference(namesToGet, namesGotten));
于 2012-04-12T13:45:11.080 回答