复杂列表 objects 的 Hamcrest 匹配器,每个包含一个复杂列表 objects

Hamcrest matcher for list of complex objects with each containing a list of complex objects

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

我有这些 类;

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)))

所以在某种程度上,我希望在 listOfB 中匹配 b1b2 值的 B 及其 listOfC包含具有值 c1c2.

的特定 C

虽然您可以创建一个复合 Hamcrest 匹配器,但您面临的困难表明您的测试方法存在缺陷。

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

A 有一个正确的 B 列表很好,但是那些 C 的行为完全取决于 B 并且属于 [=21] =]其 测试。

很抱歉回答我自己的问题,但我最后给出的代码是正确的。内部列表 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 class 中的一个字段,它的类型是 Boolean,不知何故 hasProperty("boolField", true) 不匹配,说 property "boolField" is not readable.可能是由于 Boolean 的 getter 方法没有 get 前缀,