复杂列表 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
中匹配 b1
和 b2
值的 B
及其 listOfC
包含具有值 c1
和 c2
.
的特定 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
前缀,
抱歉,标题很长,但我的问题如下;
我有这些 类;
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
中匹配 b1
和 b2
值的 B
及其 listOfC
包含具有值 c1
和 c2
.
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
前缀,