You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

AssertJ优化:简化对象集合断言代码的技术问询

没问题,这确实是个很合理的优化需求——把重复的断言合并,既能减少冗余代码,也让测试逻辑更清晰。我帮你整理成两个简洁的断言语句,同时还加了一些可选的优化建议供参考:

简化后的AssertJ断言实现
// 先断言集合总大小符合预期
assertThat(produktUebersichtViews).hasSize(4);

// 批量验证3个PRODUKT_BASIS类型的对象
assertThat(produktUebersichtViews)
    .extracting("objectId", "typ", "title", "status", "bearbeiter", "bearbeiterName", "erledigungsFrist", "uebersichtTyp", "referencedProduktBasis")
    .containsAnyOf(
        tuple(ehbEinrichtung.getObjectId(), ehbEinrichtung.getProduktBasisTyp(), ehbEinrichtung.getName(), ehbEinrichtung.getZustand().name(), ehbEinrichtung.getBearbeiter(), ehbEinrichtung.getBearbeiterName(), ehbEinrichtung.getErledigungsFrist(), "PRODUKT_BASIS", ehbEinrichtung.getReferencedProduktBasis()),
        tuple(ehbPerson.getObjectId(), ehbPerson.getProduktBasisTyp(), ehbPerson.getName(), ehbPerson.getZustand().name(), ehbPerson.getBearbeiter(), ehbPerson.getBearbeiterName(), ehbPerson.getErledigungsFrist(), "PRODUKT_BASIS", ehbPerson.getReferencedProduktBasis()),
        tuple(ehbAbrechnung.getObjectId(), ehbAbrechnung.getProduktBasisTyp(), ehbAbrechnung.getName(), ehbAbrechnung.getZustand().name(), ehbAbrechnung.getBearbeiter(), ehbAbrechnung.getBearbeiterName(), ehbAbrechnung.getErledigungsFrist(), "PRODUKT_BASIS", ehbAbrechnung.getReferencedProduktBasis())
    );

// 单独验证PRODUKT_ERGEBNIS类型的对象
assertThat(produktUebersichtViews)
    .extracting("objectId", "typ", "title", "status", "bearbeiter", "bearbeiterName", "erledigungsFrist", "uebersichtTyp")
    .contains(tuple(pruefbericht.getObjectId(), pruefbericht.getProduktErgebnisTyp(), pruefbericht.getName(), pruefbericht.getZustand().name(), pruefbericht.getBearbeiter(), pruefbericht.getBearbeiterName(), pruefbericht.getErledigungsFrist(), "PRODUKT_ERGEBNIS"));

可选的进阶优化

如果想让代码更易维护、更类型安全,还可以做这几点优化:

  • 用方法引用替代字符串字段名:
    原来的字符串字段名容易出现拼写错误,换成ProduktUebersichtView的getter方法引用会更可靠:

    .extracting(
        ProduktUebersichtView::getObjectId,
        ProduktUebersichtView::getTyp,
        ProduktUebersichtView::getTitle,
        ProduktUebersichtView::getStatus,
        ProduktUebersichtView::getBearbeiter,
        ProduktUebersichtView::getBearbeiterName,
        ProduktUebersichtView::getErledigungsFrist,
        ProduktUebersichtView::getUebersichtTyp,
        ProduktUebersichtView::getReferencedProduktBasis
    )
    
  • 封装Tuple生成逻辑:
    给你的实体类(比如EhbEinrichtung、EhbPerson等)添加一个生成断言Tuple的方法,这样断言代码会更简洁:

    // 以EhbEinrichtung为例,添加方法
    public Tuple toProduktUebersichtTuple() {
        return tuple(
            getObjectId(),
            getProduktBasisTyp(),
            getName(),
            getZustand().name(),
            getBearbeiter(),
            getBearbeiterName(),
            getErledigungsFrist(),
            "PRODUKT_BASIS",
            getReferencedProduktBasis()
        );
    }
    

    之后断言部分就可以简化成:

    .containsAnyOf(
        ehbEinrichtung.toProduktUebersichtTuple(),
        ehbPerson.toProduktUebersichtTuple(),
        ehbAbrechnung.toProduktUebersichtTuple()
    );
    

另外,最后一个断言我把containsAnyOf改成了contains——因为你明确知道集合里只有这一个PRODUKT_ERGEBNIS类型的对象,用contains语义更准确,AssertJ也会严格验证这个元素确实存在于集合中。

内容的提问来源于stack exchange,提问作者Ely

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 08:45:18