如何编写ArchUnit规则检查@DoNotUse标注的构造/方法未被调用
用ArchUnit检查被@DoNotUse注解的构造方法是否未被调用
ArchUnit没有直接提供beCalled()或neverBeCalled()这类内置方法,但可以通过两种方式实现需求:
方式一:自定义ArchCondition(带详细错误信息)
通过自定义条件检查构造方法的调用记录,若存在调用则触发违规:
ArchRule doNotUseConstructorsRule = ArchRuleDefinition.constructors() .that().areAnnotatedWith(DoNotUse.class) .should(new ArchCondition<JavaConstructor>("never be called") { @Override public void check(JavaConstructor constructor, ConditionEvents events) { List<JavaCall<?>> calls = constructor.getCallsToSelf(); if (!calls.isEmpty()) { events.add(SimpleConditionEvent.violated( constructor, String.format("被@DoNotUse标记的构造方法 %s 被调用了 %d 次", constructor.getFullName(), calls.size()) )); } } });
方式二:使用noCallsTo规则(简洁写法)
通过规则直接声明“不允许存在对目标构造方法的调用”:
ArchRule doNotUseConstructorsRule = ArchRuleDefinition.noCallsTo( DescribedPredicate.describe("被@DoNotUse注解的构造方法", target -> target instanceof JavaConstructor && target.isAnnotatedWith(DoNotUse.class)) ).should().exist();
注意事项
- 确保ArchUnit扫描范围覆盖所有可能调用这些构造方法的代码,避免遗漏;
- 两种方式都能实现核心需求,自定义条件的优势是可以输出更具体的错误详情,帮助定位问题。
内容的提问来源于stack exchange,提问作者tbeernot
相关产品推荐
相关产品推荐

