Archunit测试:类只能访问它们实现的接口。
创始人
2024-09-12 07:30:39
0

在ArchUnit中,可以编写以下测试用例来确保类只能访问它们实现的接口:

import com.tngtech.archunit.junit.AnalyzeClasses;
import com.tngtech.archunit.junit.ArchTest;
import com.tngtech.archunit.lang.ArchRule;
import com.tngtech.archunit.lang.syntax.ArchRuleDefinition;

import java.util.Collection;

import static com.tngtech.archunit.lang.syntax.ArchRuleDefinition.noClasses;

@AnalyzeClasses(packages = "com.example")
public class InterfaceImplementationTest {

    @ArchTest
    public static final ArchRule classes_should_only_access_implemented_interfaces =
            noClasses().should(new ClassAccessingInterfacesOtherThanItsOwn());

    private static class ClassAccessingInterfacesOtherThanItsOwn implements ArchCondition {
        @Override
        public void check(JavaClass javaClass, ConditionEvents events) {
            Collection declaredInterfaces = javaClass.getInterfaces();

            if (declaredInterfaces.isEmpty()) {
                return;
            }

            Set implementedInterfaces = new HashSet<>(javaClass.getInterfaces());

            implementedInterfaces.retainAll(JavaClass.Predicates.resideInAPackage(javaClass.getPackageName()));

            Set accessedInterfaces = new HashSet<>();
            for (JavaMethod javaMethod : javaClass.getMethods()) {
                accessedInterfaces.addAll(javaMethod.getRawParameterTypes());
                accessedInterfaces.addAll(javaMethod.getRawReturnType().resolve().getAllInterfaces());
            }

            for (JavaClass accessedInterface : accessedInterfaces) {
                if (!implementedInterfaces.contains(accessedInterface)) {
                    events.add(SimpleConditionEvent.violated(javaClass,
                            String.format("%s accesses interface %s, which is not implemented by %s",
                                    javaClass.getName(),
                                    accessedInterface.getName(),
                                    javaClass.getName())));
                }
            }
        }
    }
}

该测试用例将确保代码中没有类访问除它们实现的接口之外的其他接口。该测试用例的基本思想是:对于每个类,获取该类实现的所有接口。然后,获取该类的每个方法中使用的所有接口。如果这个方法使用了该类没有实现的接口,则引发违规事件。

相关内容

热门资讯

我来分享“wepoker发牌机... 我来分享“wepoker发牌机制的特点”开挂辅助挂(透视)技巧教程是一款可以让一直输的玩家,快速成为...
开挂辅助下载"wep... 开挂辅助下载"wepoker手机插件"开挂(透视)辅助平台(有挂讲解);打开点击测试直接进入微信(1...
一分钟了解“wepoker有没... >>>您好:,软件加微信【添加136704302】确实是有挂的,很多玩家在这款游戏中打牌都会发现很多...
开挂辅助工具"aap... 开挂辅助工具"aapoker脚本"开挂(透视)辅助软件(有挂分析);无需打开直接搜索薇:136704...
玩家必备攻略“wepoker真... >>>您好:,软件加微信【添加136704302】确实是有挂的,很多玩家在这款游戏中打牌都会发现很多...
开挂辅助平台"xpo... 开挂辅助平台"xpoker透视辅助"开挂(透视)辅助平台(有挂教学) >>您好:软件加薇136704...
程序员教你“wepoker开挂... 无需打开直接搜索;操作使用教程:程序员教你“wepoker开挂辅助方法”开挂辅助下载(透视)扑克教程...
开挂辅助插件"pok... poker world辅助是一款专注玩家量身打造的游戏记牌类型软件,在poker world辅助这款...
一分钟了解“wepoker透视... 一分钟了解“wepoker透视开挂挂”开挂辅助脚本(透视)2026新版教程是一款可以让一直输的玩家,...
开挂辅助插件"wep... 较多好评“微乐万能挂官网”开挂(透视)辅助教程 了解更多开挂安装加(136704302)微信号是一款...