【问题标题】:Using hamcrest to compare a list of objects containing another list of objects使用 hamcrest 比较包含另一个对象列表的对象列表
【发布时间】:2016-10-05 15:51:32
【问题描述】:

我有以下对象图:

Order --> List of Lines --> List of Shipments object

Line 对象有一个名为lineNumber 的属性。 Shipment 对象还有一个名为lineNumber 的属性。我不知道为什么他们都有它,但那些是我处理过的卡片。

是否可以比较每一行的line.getLineNumber().equals(shipment.getLineNumber())

所以实际上,我想测试以下内容:

for(Line line : order.getLines(){
    for(Shipment ship : line.getShipments()) {
         assertEquals(line.getLineNumber(), shipment.getLineNumber());
    }
}

我尝试了以下方法,但没有成功:

assertThat(order.getLines(), everyItem(Matchers.<Line>hasProperty("shipments", everyItem(Matchers.<Shipment>hasProperty("lineNumber", is(line.getLineNumber())))))

显然,我没有对 line 的引用,那么在这种情况下我将如何比较这些值?

【问题讨论】:

    标签: java junit hamcrest


    【解决方案1】:

    assertThat 正好有两个参数(嗯,三个,但第三个只是打印失败的消息):

    1. 实际值(所以,是的,getLines())在那里是可以的
    2. 预期值,应该是某种形式的 ma​​tcher

    因此,您将 多个“预期匹配器”添加到 same 调用的想法根本行不通。

    你得到了:

    assertThat(a1, e1, e2, e3);
    

    相反:将您使用 assertThat 的单个调用拆分为多个调用 - 一个用于您要检查的每个“预期”条件。

    assertThat(a1, e1;
    assertThat(a1, e2);...
    

    如果上述方法没有帮助,或者如果您希望编写只需要一个 assertThat 的代码,您可以随时继续编写自己的客户匹配器,例如从我为其他一些问题整理的简单解决方案开始question.

    郑重声明:那是我的第一个自定义匹配器,我在不到 10 分钟内就完成了工作;换句话说:一旦你进入概念,这是一项非常容易的任务!

    【讨论】:

    • 很公平。我不必在 1 行中完成所有操作,但我仍然不确定是否可以将行级别的 lineNumber 属性与装运级别的属性进行比较,而无需我将行号显式保存在 for 中的局部变量中循环,然后比较 Shipment 对象的 everyItem 子句。
    • 那么您要求我们解释您的要求;和您现有的源代码。这里没有人能告诉你如果比较这些值是有意义的。如果存在它们应该相等的约束,那么它在您的上下文中。我们只能帮助“如何做事”;不是“做什么”。 “什么”是你的上下文。
    【解决方案2】:

    不完全是你要找的,但至少适合一行:

        order.getLines().forEach(
            l -> 
              assertThat(l.getShipments(), 
                 everyItem(
                      hasProperty("lineNumber", is(l.getLineNumber())))));
    

    正如你所说,让匹配器持有对正在检查的对象的引用可能很棒,但我不知道如何使用 Hamcrest 来做到这一点。

    【讨论】:

    • 是的,这与我的想法一致,但 hamcrest 似乎没有能力保存对您提到的对象的引用。太糟糕了!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-17
    • 2022-01-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多