如何测试ArchUnit规则?寻求保障规则有效性的自动化测试方法
自动化验证ArchUnit规则有效性的方法
核心思路
不用手动修改生产代码,而是在测试源码目录下创建专门的违规测试类,模拟真实的违规场景,然后用ArchUnit的测试API自动验证规则是否能捕获这些违规。
具体步骤
创建测试专用的违规代码
在src/test/java下单独建一个目录(比如com/yourproject/archtest/violations),编写模拟违规的类,比如:// 模拟违反"service包不能依赖dao包"的规则 package com.yourproject.archtest.violations.service; import com.yourproject.dao.UserDao; // 故意引入dao包的类,制造违规 public class BadService { private UserDao userDao; // 违规依赖 }编写ArchUnit测试用例
在测试类中,加载这些违规测试类,用你的ArchRule去检查,断言规则会检测到违规(即规则验证失败):@ArchTest public static final ArchRule SERVICE_SHOULD_NOT_DEPEND_ON_DAO = noClasses().that().resideInAPackage("..service..") .should().dependOnClassesThat().resideInAPackage("..dao.."); @Test void testServiceDependencyRuleCatchesViolations() { // 加载测试目录下的违规类 JavaClasses classes = new ClassFileImporter() .importPackages("com.yourproject.archtest.violations.service"); // 断言规则会检测到违规,即执行规则时会抛出ArchUnitAssertionError Assertions.assertThrows(ArchUnitAssertionError.class, () -> { SERVICE_SHOULD_NOT_DEPEND_ON_DAO.check(classes); }); }维护硬编码的包名/字段名
把规则里的硬编码常量抽成测试类的静态变量,比如:private static final String SERVICE_PACKAGE = "..service.."; private static final String DAO_PACKAGE = "..dao.."; @ArchTest public static final ArchRule SERVICE_SHOULD_NOT_DEPEND_ON_DAO = noClasses().that().resideInAPackage(SERVICE_PACKAGE) .should().dependOnClassesThat().resideInAPackage(DAO_PACKAGE);后续包名或字段名变更时,只需要修改静态变量,同时更新违规测试类的对应内容即可,避免多处硬编码维护麻烦。
额外技巧
- 为每个ArchRule单独编写测试用例,确保每个规则的有效性都被覆盖。
- 如果规则涉及字段名检查(比如"不能使用名为
password的公共字段"),可以在违规测试类中定义public String password;,然后用规则检查该类,断言违规被捕获。
内容的提问来源于stack exchange,提问作者Philippe K
相关产品推荐
相关产品推荐

