Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/373.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 用于复杂对象列表的Hamcrest匹配器,每个对象包含一个复杂对象列表_Java_Junit_Hamcrest - Fatal编程技术网

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

Java 用于复杂对象列表的Hamcrest匹配器,每个对象包含一个复杂对象列表,java,junit,hamcrest,Java,Junit,Hamcrest,很抱歉标题太长,但我的问题如下 我有这些课程 public class A { int a1; int a2; List<B> listOfB; } 如果只为B声明它拥有的C列表,我将使用以下自定义匹配器; Matcher-cMatcher=Matchers.hasItems(allOf(hasProperty(“c1”),equalTo(c1)),hasProperty(“c2”,equalTo(c2))) 但是如何从A执行断言呢?我想在一个更大范围的匹配

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

我有这些课程

public class A {
    int a1;
    int a2;
    List<B> listOfB;
}
如果只为
B
声明它拥有的
C
列表,我将使用以下自定义匹配器;
Matcher-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
列表中的
B
b1
b2
值,以及包含特定
C
listOfC
c1
c2

值相匹配,同时您可以创建一个复合Hamcrest匹配器,您面临的困难概括了您的测试方法的一个缺点

建议将测试绑定到每个类,而不是其他类


A
有一个正确的
B
列表是可以的,但是那些
C
s的行为完全取决于
B
,应该属于它的测试。

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

因此,要匹配列表中的列表

Matcher-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)
不匹配,表示
属性“boolField”不可读。可能是因为Boolean的getter方法没有
get
前缀,

我同意,但是我所说的类是在我实际测试的类的主方法的响应对象中。这些
A
B
C
类的结构是我无法理解的。
public class B {
    int b1;
    int b2;
    List<C> listOfC;
}
public class C {
    int c1;
    int c2;
}