You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何测试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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.19 03:22:05