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

Sar*_*els 7 java junit guava

在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
Run Code Online (Sandbox Code Playgroud)

我目前失败了:

java.lang.AssertionError:expected: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()))
Run Code Online (Sandbox Code Playgroud)

Col*_*ert 15

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

assertTrue(namesToGet.containsAll(namesGotten));
assertTrue(namesGotten.containsAll(namesToGet));
Run Code Online (Sandbox Code Playgroud)

但是,如果您决定使用ListSet代替Collection,则接口契约指定a List等于另一个List(相同Set)iff两者包含相同的值.

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


资源:


Lou*_*man 6

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

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


Kkk*_*kev 6

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

assertThat(namesGotten, containsInAnyOrder(namesToGet))
Run Code Online (Sandbox Code Playgroud)

  • Hamcrest文档在这方面有点缺乏,因此值得尝试一些匹配来说服自己他们做的是正确的事情.或者,源代码位于http://code.google.com/p/hamcrest/source/browse/trunk/hamcrest-java/hamcrest-library/src/main/java/org/hamcrest/collection/IsIterableContainingInAnyOrder.java R = 480.是的,它检查集合1是否具有集合2的所有元素,反之亦然,因此它们具有相同的大小. (2认同)