1

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

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

我想测试两者:返回集合的可排序(因为现在我正在使用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>并且谓词中的参数是Strings。我需要在它之间架起某种桥梁。

4

2 回答 2

2

由于Predicate是一个 Guava 对象,并且 Hamcrest 不依赖于 Guava,因此它不会有一个 Matcher 需要一个Predicate. 此外,由于 Guava 不依赖于 Hamcrest,因此它们也不会提供 Matcher。

我建议编写自己的带有谓词的匹配器。这相对容易做到。获取源代码IsIterableContainingInOrder并将其修改为Predicate.

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

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

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

于 2012-04-13T11:31:03.397 回答
1

我会使用MyObjectFactoryin testObject.generate(),避免直接new声明。 MyObjectFactory将是testObject. 这样做,我将获得 2 个好处:

  1. testObjectMyObject(之间的较弱耦合仅在接口方面testObject知道MyObject
  2. 模拟的可能性MyObjectFactory,最后,断言 3 个有序调用的可能性MyObjectFactory.BuildNewWithValue("x")MyObjectFactory.BuildNewWithValue("y")MyObjectFactory.BuildNewWithValue("z")

您的单元测试将是交互测试。

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

于 2012-04-13T10:05:04.620 回答