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
相关产品推荐
相关产品推荐

