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

ArchUnit:如何测试当前包之外的特定类的导入?

班高明
2023-03-14

为了外部化用户界面字符串,我们使用支持的“消息类”方法,例如在Eclipse和其他IDE中。这种方法要求在每个需要一些用户界面字符串的包中,必须有一个类“消息”,该类提供一个静态方法String getString(key),通过该方法可以获得实际的字符串以显示给用户。使用Java的资源机制在内部访问/获取字符串以实现国际化。

特别是在一些重构之后,我们一次又一次地从一个类中意外导入来自不同包的消息。

因此,我想创建一个archunit规则,检查我们是否只访问来自同一个包的名为“Messages”的类。一、 e.如果包x.y.z与当前类(即包含导入的类)不同,则类x.y.z.Messages的每次导入都是错误的

我到这里为止:

@ArchTest
void preventReferencesToMessagesOutsideCurrentPackage(JavaClasses classes) {
    ArchRule rule;
    rule = ArchRuleDefinition.noClasses()
        .should().accessClassesThat().haveNameMatching("Messages")
        .???
        ;
    rule.check(classes);
}

但现在我被困在???。一个短语“condition”和引用/导入的类“Messages”怎么可能与该类不在同一个包中?

我不知何故迷路了所有这些archunit方法,这些方法似乎都不适合这里,也不适合组成上述条件。也许我只是看不见森林,因为有很多树。有任何建议或指导吗?

共有1个答案

芮岳
2023-03-14

您需要对JavaAccess的实例进行操作以验证依赖关系。JavaAccess提供有关调用者和目标的信息,以便您可以根据两个类的包名称动态验证访问。

DescribedPredicate<JavaAccess<?>> isForeignMessageClassPredicate = 
        new DescribedPredicate<JavaAccess<?>>("target is a foreign message class") {

    @Override
    public boolean apply(JavaAccess<?> access) {
        JavaClass targetClass = access.getTarget().getOwner();
        if ("Message".equals(targetClass.getSimpleName())) {
            JavaClass callerClass = access.getOwner().getOwner();
            return !targetClass.getPackageName().equals(callerClass.getPackageName());
        }

        return false;
    }
};

ArchRule rule =
    noClasses().should().accessTargetWhere(isForeignMessageClassPredicate);
 类似资料:
  • 在ArchUnit-Test中,是否有可能从分层测试条件中排除特定的类? 希望我能说清楚...

  • 我编写了我的第一个ArchUnit测试: 这个项目是用Maven构建的,所以类在不同的目录中。 将名称以“tests”或其他东西结尾的类分开是不够的,因为有许多类不是测试,而是只存在于测试类路径中。

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

  • 我想在我的项目中测试特定的测试类,因为有很多测试类失败,我只想一次测试一个类。 我在以下文件夹中创建了测试类: 因此,我尝试了以下命令,但均无效: = 有什么帮助吗?谢谢

  • 我的项目有两个OSGi包(A和B),它们需要使用不同版本的-A需要1.1.0版本,而B需要1.1.1版本。 如果我在这个sling.properties文件中给出的javax.activation的版本大于1.1.1,那么a和B都使用系统版本(尽管文件中指定了import-packages的版本);但如果我给出的版本小于1.1.1,那么两个包都使用AEM提供的版本。 如何配置我的Bundle,以便

  • 我有一个简单的类,它将数据写入CSV文件: 我想知道如何测试这个类中包含的方法。我发现信息表明这可以通过使用Mockito来实现。是这样吗?我该怎么做呢?