![](/img/trans.png)
[英]How to implement a java.util.function.Predicate as Kotlin lambda?
[英]How to unit test a function that contains a lambda function that uses Predicate
幾天來我一直在嘗試對這個 function 進行單元測試,但似乎無法解決,而且我在所有服務中都有類似的功能,這確實降低了代碼覆蓋率。 有沒有辦法對它進行單元測試,如果沒有,也許只是讓 jacoco/sonarqube 忽略它?
public Specification<ContratEntity> getSpecification(ContratDto dto) {
List<DepartementEntity> departementEntities = securityService.checkDepartementFiltre();
String[] filtreBus = securityService.checkBuFiltre();
List<TypeContratEnum> typeContratEnums = securityService.checkTypeContratFiltre();
return (root, query, cb) -> {
List<Predicate> predicates = new ArrayList<>();
if (dto.getNumero() != null && !"".equals(dto.getNumero())) {
predicates.add(cb.like(cb.lower(root.get("numero")), "%" + dto.getNumero().toLowerCase() + "%"));
}
if (dto.getBu() != null && !"".equals(dto.getBu())) {
predicates.add(cb.like(cb.lower(root.get("bu")), "%" + dto.getBu().toLowerCase() + "%"));
}
if (dto.getDepartement() != null && dto.getDepartement().getAbreviation() != null) {
predicates.add(cb.like(cb.lower(root.get("departement").get("abreviation")), dto.getDepartement().getAbreviation().toLowerCase()));
}
if (departementEntities != null) {
predicates.add(cb.or(
root.get("departement").in(departementEntities),
root.get("departement").isNull()
));
}
if (filtreBus != null) {
predicates.add(root.get("bu").in(filtreBus));
}
if (typeContratEnums != null) {
predicates.add(root.get("type").in(typeContratEnums));
}
if (dto.getLbvFournisseur() != null && dto.getLbvFournisseur().getCnuf_frn() != null && !dto.getLbvFournisseur().getCnuf_frn().equals("")) {
predicates.add(cb.or(
cb.like(cb.lower(root.join("lbvFournisseur", JoinType.LEFT).get("cnuf_frn")), dto.getLbvFournisseur().getCnuf_frn().toLowerCase()),
cb.like(cb.lower(root.join("hlvFournisseur", JoinType.LEFT).get("cnuf_frn")), dto.getLbvFournisseur().getCnuf_frn().toLowerCase()),
cb.like(cb.lower(root.join("mlvFournisseur", JoinType.LEFT).get("cnuf_frn")), dto.getLbvFournisseur().getCnuf_frn().toLowerCase())
));
}
if (dto.getLbvFournisseur() != null && dto.getLbvFournisseur().getRaison_sociale() != null) {
predicates.add(cb.or(
cb.like(cb.lower(root.join("lbvFournisseur", JoinType.LEFT).get("raison_sociale")), "%"+ dto.getLbvFournisseur().getRaison_sociale().toLowerCase() + "%"),
cb.like(cb.lower(root.join("hlvFournisseur", JoinType.LEFT).get("raison_sociale")), "%"+ dto.getLbvFournisseur().getRaison_sociale().toLowerCase() + "%"),
cb.like(cb.lower(root.join("mlvFournisseur", JoinType.LEFT).get("raison_sociale")), "%"+ dto.getLbvFournisseur().getRaison_sociale().toLowerCase() + "%")
));
}
if (dto.getLbvFournisseur() != null && dto.getLbvFournisseur().getIce() != null && dto.getLbvFournisseur().getIce() != "") {
predicates.add(cb.or(
cb.like(cb.lower(root.join("lbvFournisseur", JoinType.LEFT).get("ice")), dto.getLbvFournisseur().getIce().toLowerCase()),
cb.like(cb.lower(root.join("hlvFournisseur", JoinType.LEFT).get("ice")), dto.getLbvFournisseur().getIce().toLowerCase()),
cb.like(cb.lower(root.join("mlvFournisseur", JoinType.LEFT).get("ice")), dto.getLbvFournisseur().getIce().toLowerCase())
));
}
if (dto.getType() != null) {
predicates.add(cb.equal(root.get("type"), dto.getType()));
}
Predicate[] predicatesArray = new Predicate[predicates.size()];
query.orderBy(cb.desc(root.get("id")));
return cb.and(predicates.toArray(predicatesArray));
};
}
我會提取一個帶有 Lambda 表達式內容的方法,然后將 lambda 本身轉換為 class 字段。 這樣您就可以測試提取的方法,而 lambda 本身將不會包含在覆蓋范圍內。 我還將創建字段 static 以避免不必要的功能接口實現實例化。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.