测试集合中的所有元素是否满足谓词

时间:2012-04-13 09:51:06

标签: junit hamcrest

我需要测试返回某些复杂对象的有序List的方法。简化示例:

class MyObject {
    public String foo() { return someString; }
}

我想测试两者:orderable of return collection(从现在开始我使用org.hamcrest.collection.IsIterableContainingInOrder.contains并实现谓词)。

总结一下。我正在寻找这样的语法:

@Test
public void shouldMatchPredicate() {
    List<MyObject> collection = testObject.generate();
    //collection = [myObject#x, myObject#y, myObject#z]
    assertThat(collection, somePredicate("x", "y", "z")
}

默认值为contains的方法不起作用,因为第一个参数是Collection<MyObject>,谓词中的参数是String s。我需要它之间的某种桥梁。

2 个答案:

答案 0 :(得分:2)

由于Predicate是一个Guava对象而Hamcrest不依赖于Guava,因此它不会有一个匹配Predicate的匹配器。此外,由于番石榴不依赖于Hamcrest,他们也不会提供Matcher。

我建议你自己编写一个带谓词的Matcher。这相对容易。获取IsIterableContainingInOrder的源代码并修改它以获取Predicate

另一个选择是执行以下操作:

assertThat(Iterables.all(myList, myPredicate), CoreMatchers.is(true));

这不会为您提供有关失败的大量文档,但会正确通过/失败。

答案 1 :(得分:1)

我会在MyObjectFactory中使用testObject.generate(),避免使用直接new语句。 MyObjectFactory将是testObject的依赖项。 这样做,我将获得2个好处:

  1. testObjectMyObject之间较弱的耦合(testObject仅在接口方面知道MyObject
  2. 模仿MyObjectFactory的可能性,最后是断言3个有序来电的可能性:MyObjectFactory.BuildNewWithValue("x")MyObjectFactory.BuildNewWithValue("y")MyObjectFactory.BuildNewWithValue("z")
  3. 您的单元测试将是一次交互测试。

    要断言返回的集合本身,我会写3个断言。