当前位置: 首页 > 知识库问答 >
问题:

测试@service的ArchUnit规则只依赖于自己包中的@repository?

弘志勇
2023-03-14

我希望编写一个ArchUnit规则,验证服务类(由@serviceSpring注释所指出)只使用自己包中的存储库,而不使用其他包中的存储库。

noClasses().that()
  .areAnnotatedWith(Service.class)
  .should()
  .dependOnClassesThat().areAnnotatedWith(Repository.class)
  .orShould().dependOnClassesThat().haveSimpleNameEndingWith("Repository")

或者,我可以做:

noClasses().that()
  .resideInAPackage("com.company.backend.user")
  .and()
  .areAnnotatedWith(Service.class)
  .should()
  .dependOnClassesThat(resideOutsideOfPackage("com.company.backend.user").and(annotatedWith(Repository.class)))
  .orShould().dependOnClassesThat(have(resideOutsideOfPackage("com.company.backend.user").and(simpleNameEndingWith("Repository"))))
  .as("Service classes should only use Repository class(es) from the own package");

但是,我重复包名com.company.backend.user3次,我需要为每个包定义这个规则。

共有1个答案

经正祥
2023-03-14

您需要在依赖项上定义一个谓词并对其进行操作。

classes()
    .that()
    .areAnnotatedWith(Service.class)
    .should(ArchConditions.onlyHaveDependenciesWhere(RepositoryAccessesAreOnlyWithinPackage.PREDICATE));

谓词检查访问目标是否是存储库,如果是,它将验证目标是否与调用类位于同一个包中:

private static class RepositoryAccessesAreOnlyWithinPackage
        extends DescribedPredicate<Dependency> {

    public static final DescribedPredicate<Dependency> PREDICATE = new RepositoryAccessesAreOnlyWithinPackage();

    public RepositoryAccessesAreOnlyWithinPackage() {
        super("repository accesses are only within the same package");
    }

    @Override
    public boolean apply(Dependency dependency) {
        if (isRepositoryAccess(dependency)) {
            return areClassesInTheSamePackage(dependency.getOriginClass(), dependency.getTargetClass());
        }

        return true;
    }

    private boolean isRepositoryAccess(Dependency dependency) {
        return dependency.getTargetClass().isAnnotatedWith(Repository.class);
    }

    private boolean areClassesInTheSamePackage(JavaClass originClass, JavaClass targetClass) {
        return originClass.getPackageName().equals(targetClass.getPackageName());
    }
}
 类似资料:
  • 我无法使用ArchUnit制定以下测试: 我想确保某个包中的所有类只访问应用程序基包之外或某个子包内的类(“或”而不是“xor”)。 我得到的是: 问题是,或条件应该在onlyAccessClassesthat()中。如果一个类同时具有两种类型的访问权限,上述公式将失败,我希望这两种类型都有效。 我怎样才能实现我想要的?谢谢你在这方面的任何帮助...

  • 用户和首选项由objectProperty链接。 objectProperty断言需要通过SWRL规则从其他用户方面推断。例如,如果用户有听力困难,则需要将设置为,因此: 这很好用。但是,由于我有其他SWRL规则,这些规则也为相同的用户推断,例如: 我需要的是一个规则,不知怎么的,只有在没有更高的级别已经断言的情况下才会断言偏好。在给定的示例中,即使为true,唯一断言的级别也应该是,因为是其他规

  • 在我的根项目中,我有两个子项目具有这种包结构。 在项目1中,我有一个用大规定义的类,就像这样 问题是,如果我运行该测试,它也会分析项目2中的所有内容。我如何排除包com.app.api?

  • 我不清楚是否因为robolectric还没有完成一些必要的实现而不可能使用robolectric来扩展这个视图,或者我只是没有正确地连接所有的东西。 我尝试将依赖项添加到测试中,如下所述: 但这没有效果。 完整测试类: 和堆栈跟踪:

  • 主要内容:1. dependOnMethods示例,2. dependsOnGroups示例有时,我们可能需要以特定顺序调用测试用例中的方法,或者可能希望在方法之间共享一些数据和状态。 TestNG支持这种依赖关系,因为它支持在测试方法之间显式依赖的声明。 TestNG允许指定依赖关系: 在注释中使用属性,或者 在注释中使用属性。 在TestNG中,我们使用和来实现依赖测试。 如果依赖方法失败,则将跳过所有后续测试方法。 为了方便演示使用,首先创建一个 Maven 项目: DependO