当前位置: 首页 > 知识库问答 >
问题:

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

和飞翔
2023-03-14

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

我有这些课程;

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

但是如何从A执行断言呢?我想在一个更大范围的匹配器中使用这个C列表匹配器,它执行以下操作:;

匹配器。hasItems(allOf(hasProperty(“b1”,equalTo(b1))、hasProperty(“b2”,equalTo(b2))、hasProperty(“listOfC”,cMatcher)))

因此,在某种程度上,我希望将B列表中的Bb1b2值以及包含特定ClistOfCc1c2值相匹配。


共有2个答案

蔺翰音
2023-03-14

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

德米特定律建议您将测试绑定到每个类,而不是其他类。

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

秦凯定
2023-03-14

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

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

匹配器

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

匹配器。hasItems(allOf(hasProperty(“b1”,equalTo(b1))、hasProperty(“b2”,equalTo(b2))、hasProperty(“listOfC”,cMatcher)))

将符合我在问题中描述的情况。

我遇到的问题是我的C类中的一个字段,它具有布尔类型,不知何故hasProperty("boolField",true)不匹配,说属性"boolField"不可读。可能是因为Boolean的getter方法没有get前缀,在这个问题中,它说基本布尔工作,而布尔对象在这种情况下失败

 类似资料:
  • 我得到和错误当我执行 错误是: 未处理的异常:com.google.gson.JsonSyntaxException:java.lang.IllegalStateException:预期BEGIN_OBJECT但BEGIN_ARRAY在第1行第52列路径$. f 这是 json 响应 我有这个班级 和这个其他

  • 嗨,我有两个对象列表。清单1和清单2 App1中的员工列表 在sql中,我们可以很容易地通过ID列进行连接。但是这里要点击seperate API来阅读清单2。 我可以从清单2创建map,并将EmpId作为键,继续从map获取对象,并将详细信息设置到清单1。 想知道有没有更好的方法来做这件事。

  • 我有一个gprsEvents列表,其中列表中的每个元素都是一个映射 ,如下所示。我需要: null 我开始考虑使用Java8Stream(groupingBy):gprsents.stream().collectors.groupingBy(Map->map.Get(“CallChargingID”).ToString())) 我现在坚持得到合适的结果,特别是在一个单一的地图和上面提到的字段的列表

  • 我有两个对象列表,它们在两个列表中都有重复名称。我需要从清单2中删除清单1中的所有重复值。 下面是一个场景,类有名称变量,用这个变量需要检查清单1中的重复值并需要删除。 //这是具有3个对象的第一个列表 清单1大小为1 请建议我在Java8与流。

  • 5.1.3 用对象表示复杂数据 程序是对数据进行操作的过程,因此数据表示和操作过程是编程时要考虑的两大问题。 我们已经熟悉用编程语言提供的数据类型来表示数据,例如用字符串表示雇员姓名,用整数表示年龄,用浮点数表示工资等。对于某些稍微复杂一点的数据我们也有适合的数据类 型来表示,例如雇员名单可以用一个字符串数据构成的列表来表示。当数据表示确定之后, 我们接着用各种数据类型所支持的数据操作来处理数据,