如何配置ArchUnit接口命名规则,使其仅作用于普通接口而排除注解(@interface)类
如何配置ArchUnit接口命名规则,使其仅作用于普通接口而排除注解(@interface)类
这个问题我之前也碰到过,ArchUnit里的areInterfaces()方法默认会把Java中的**注解类(@interface)**也归类为接口类型(毕竟字节码层面注解确实是一种特殊的接口),所以你的初始测试会误判注解类。只需要在条件里添加一个过滤规则,排除注解类就行啦!
修改后的测试代码
@Test void interfacesShouldHaveNamesEndingWithTheWordInterface() { classes() .that() .areInterfaces() .and() .areNotAnnotations() // 关键:添加这一行排除注解类 .should() .haveNameMatching(".*Interface") .check(importedClasses); }
代码说明
areInterfaces():匹配所有接口类型(包括普通接口和注解类)areNotAnnotations():ArchUnit提供的现成谓词,专门用来过滤掉注解类,能精准区分普通接口和注解- 组合这两个条件后,规则就只会作用于普通的interface定义,不会影响
@interface注解类
这样调整后:
- 符合命名规范的
AnimalInterface会通过检查 - 未以Interface结尾的
Animal普通接口会触发测试失败 ValidSomething这类注解类会被完全忽略,不会纳入检查范围
备注:内容来源于stack exchange,提问作者PatPanda
相关产品推荐
相关产品推荐

