用于复杂对象列表的Hamcrest匹配器,每个包含复杂对象列表

时间:2016-02-23 08:32:52

标签: java junit hamcrest

很抱歉这个长标题,但我的问题如下;

我有这些课程;

public class A {
    int a1;
    int a2;
    List<B> listOfB;
}

public class B {
    int b1;
    int b2;
    List<C> listOfC;
}

public class C {
    int c1;
    int c2;
}

如果只有B断言它有C列表,我会使用以下自定义匹配器; Matcher<Iterable<C>> cMatcher = Matchers.hasItems(allOf(hasProperty("c1", equalTo(c1)), hasProperty("c2", equalTo(c2))))

但我怎样才能从A做出断言?我想在更大范围的匹配器中使用这个C列表匹配器来执行以下操作;

Matchers.hasItems(allOf(hasProperty("b1", equalTo(b1)), hasProperty("b2", equalTo(b2)), hasProperty("listOfC", cMatcher)))

因此,在某种程度上,我希望匹配B中已listOfBb1值的b2以及包含listOfC的{​​{1}}具有值Cc1的特定c2

2 个答案:

答案 0 :(得分:0)

虽然可能创建复合Hamcrest匹配器,但您面临的困难概述了测试方法的缺点。

Law of Demeter建议您将测试绑定到每个类而不是超出。

A的{​​{1}}列表正确无误,但这些B的行为完全取决于C并属于其< / em>测试。

答案 1 :(得分:0)

很抱歉回答我自己的问题,但我最后给出的代码是正确的。内部列表C的匹配器约束存在一些问题。

所以要匹配列表中的列表;

Matcher<Iterable<C>> cMatcher = Matchers.hasItems(allOf(hasProperty("c1", equalTo(c1)), hasProperty("c2", equalTo(c2))))

然后在更高范围的匹配器中使用它;

Matchers.hasItems(allOf(hasProperty("b1", equalTo(b1)), hasProperty("b2", equalTo(b2)), hasProperty("listOfC", cMatcher)))

将匹配我在我的问题中描述的案例。

我遇到的问题是我的C班级中的某个字段,其类型为Boolean,某种程度上hasProperty("boolField", true)不匹配,说property "boolField" is not readable。可能由于布尔的getter方法没有get前缀,in this question, it says primitive boolean works, while Boolean object fails in this situation