【问题标题】:How to exclude a class in an ArchUnit rule?如何在 ArchUnit 规则中排除一个类?
【发布时间】:2020-01-10 08:54:37
【问题描述】:

在 ArchUnit 中为分层架构创建规则时,我不清楚如何排除单个类(Main)。 The base example 排除源和目标。

...但我不明白它如何转化为我的需要。我只想忽略 Main 。为什么?因为 Main 引用了所有层,因为它注入了所有依赖项。

The original code is in my GitHubalong with the failing test。 (该项目是一个虚拟项目,因此运行起来很简单;只需克隆它,运行测试并看到一个失败)。

【问题讨论】:

    标签: java unit-testing archunit


    【解决方案1】:

    假设您已导入所有类:

    JavaClasses classes = new ClassFileImporter().importPackages("org.example");
    

    然后,您通常会根据 ArchRule 检查所有这些类,无论它是类规则还是体系结构规则:

    ArchRule rule = classes()
        .that().areAnnotatedWith(Service.class)
        .should().haveSimpleNameEndingWith("Service");
    
    rule.check(classes);
    

    要从规则中排除类,您可以过滤 classes 并将过滤后的 JavaClasses 传递给规则:

    import static com.tngtech.archunit.base.DescribedPredicate.not;
    import static com.tngtech.archunit.core.domain.JavaClass.Predicates.equivalentTo;
    import static com.tngtech.archunit.lang.conditions.ArchPredicates.are;
    
    JavaClasses allExceptMain = classes.that(are(not(equivalentTo(Main.class))));
    rule.check(allExceptMain);
    

    要排除 Main 类和在 Main 内部定义的所有类(内部类、匿名类、lambda 等),您可以调整过滤器:

    import static com.tngtech.archunit.base.DescribedPredicate.not;
    import static com.tngtech.archunit.core.domain.JavaClass.Predicates.belongToAnyOf;
    
    JavaClasses allExceptMain = classes.that(not(belongToAnyOf(Main.class)));
    rule.check(allExceptMain);
    

    【讨论】:

    • 我试过了,但它不起作用:你能在这里检查一下吗? gist.github.com/lsoares/a3e725a08f185cb1564bdc477c706fd5
    • 看起来方法调用不是直接发生在users.WebAppConfig中,而是发生在类users.WebAppConfig$javalinApp$1$2中。 (看起来像 Kotlin 生成的类结构?)我用belongToAnyOf 的示例更新了我的答案。
    • 我编辑了我的问题以添加源代码,如果你能看一下那就太好了。该项目没有部门。只需克隆并运行测试。谢谢
    【解决方案2】:

    这样的事情怎么样:

    .ignoreDependency(fullNameMatching("users.WebAppConfig"), alwaysTrue())
    

    【讨论】:

    • 我编辑了我的问题以添加源代码,如果你能看一下那就太好了。该项目没有部门。只需克隆并运行测试。谢谢
    • 我使它与: .ignoreDependency(fullNameMatching("users.WebAppConfig"), alwaysTrue()) "fullNameMatching" 谓词在 HasName 中定义。 HasType 中的类型也有类似的东西。
    • 我试过了,它变成了绿色;问题是现在我不能让它以任何方式失败。我试图打破层规则,它永远不会变红。
    • 这很奇怪,我在我的一个 java 项目中尝试过它,它工作得很好。可能是和kotlin的集成有关?
    【解决方案3】:

    另一种可能性是明确声明负责启动应用程序的源代码部分(“用户”包)作为真正的层并将其集成到您的规则中。毕竟,这就是您希望源代码工作的方式,所以我想知道是否将其设为异常。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-25
      • 1970-01-01
      • 1970-01-01
      • 2018-12-06
      相关资源
      最近更新 更多