如何用ArchUnit实现禁止方法参数来自禁用包的规则?
解决ArchUnit中
notHaveRawParameterTypes的编译错误问题 核心原因
notHaveRawReturnType针对单个返回类型做断言(参数为DescribedPredicate<? super JavaClass>),而notHaveRawParameterTypes针对整个方法的参数类型列表做断言(参数为DescribedPredicate<? super List<JavaClass>>),直接复用返回类型的断言会因为类型不匹配导致编译失败。
解决方案
根据你的检查需求,有两种常见实现方式:
方式1:检查所有参数都满足指定条件
如果要确保方法的所有参数都不是目标raw类型,需要将单个参数的断言转换为对参数列表的断言,使用DescribedPredicate.forList()方法包装:
// 定义单个参数的断言:不是raw类型的List DescribedPredicate<JavaClass> notRawList = rawType(List.class).negate(); // 将单个参数断言转换为列表断言:所有参数都满足notRawList DescribedPredicate<List<JavaClass>> allParametersNotRawList = DescribedPredicate.forList(all(notRawList)); // 构建规则:指定包下的方法,所有参数都不能是raw类型的List ArchRule parameterRule = methods() .that().areDeclaredInClassesThat().resideInAPackage("com.your.package") .should(notHaveRawParameterTypes(allParametersNotRawList));
方式2:检查特定位置的参数
如果只需要检查某个特定位置的参数(比如第一个参数),可以直接使用haveRawParameterTypeAtPosition()方法,无需处理列表断言:
// 构建规则:指定包下的方法,第一个参数不能是raw类型的List ArchRule firstParameterRule = methods() .that().areDeclaredInClassesThat().resideInAPackage("com.your.package") .and().haveParameterCountGreaterThanOrEqualTo(1) // 确保方法有至少一个参数 .should(haveRawParameterTypeAtPosition(0, rawType(List.class)).negate());
扩展说明
- 如果需要检查存在任意参数满足条件,将
all(notRawList)替换为any(notRawList)即可 - 可以替换
rawType(List.class)为你需要检查的任意类型,比如rawType(Map.class)等
内容的提问来源于stack exchange,提问作者Zartc
相关产品推荐
相关产品推荐

