我需要测试返回某些复杂对象的有序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。我需要它之间的某种桥梁。
答案 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个好处:
testObject
与MyObject
之间较弱的耦合(testObject
仅在接口方面知道MyObject
MyObjectFactory
的可能性,最后是断言3个有序来电的可能性:MyObjectFactory.BuildNewWithValue("x")
,MyObjectFactory.BuildNewWithValue("y")
和MyObjectFactory.BuildNewWithValue("z")
您的单元测试将是一次交互测试。
要断言返回的集合本身,我会写3个断言。