很抱歉这个长标题,但我的问题如下;
我有这些课程;
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
中已listOfB
和b1
值的b2
以及包含listOfC
的{{1}}具有值C
和c1
的特定c2
。
答案 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