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())));
                }
            }
        }
    }
}

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

相关内容

热门资讯

7机器人(德州nzt软件)外挂... 7机器人(德州nzt软件)外挂透明挂辅助脚本(辅助挂)扑克教程!(有挂实锤)-哔哩哔哩;支持多人共享...
第八个稳定!微扑克全自动机器人... 第八个稳定!微扑克全自动机器人(辅助)辅助透视(新版有挂)-哔哩哔哩;(需添加指定薇13670430...
一个开挂!德扑ai软件购买(开... 一个开挂!德扑ai软件购买(开房间教程)透视辅助(有人有挂)-哔哩哔哩;德扑ai软件最新版本免费下载...
第2插件!天天斗牌为什么总是输... 第2插件!天天斗牌为什么总是输(辅助挂)太坑了其实真的有挂(真的有挂)-哔哩哔哩;一、天天斗牌为什么...
第6个挂!wpk辅助插件(辅助... 第6个挂!wpk辅助插件(辅助机器人)其实真的有挂(果真有挂)-哔哩哔哩这是由厦门游乐互动科技有限公...
第1测试(德扑之星自定义)外挂... 第1测试(德扑之星自定义)外挂透明挂辅助工具(透视)玩家教你(有挂总结)-哔哩哔哩关于德扑之星自定义...
7个插件!德扑平台机器人(真的... 7个插件!德扑平台机器人(真的太假了)辅助透视(有挂教学)-哔哩哔哩;德扑平台软件透明挂作为一款德扑...
6模拟器(鱼扑克辅助)外挂透明... 这是一款非常优秀的鱼扑克辅助 ia辅助检测软件,能够让你了解到鱼扑克辅助中牌率当中全部隐藏参数,与同...
第十真的有挂!闽游麻将十三水怎... 第十真的有挂!闽游麻将十三水怎么提升胜率(辅助挂)太坑了其实真的有挂(有挂技巧)-哔哩哔哩1、完成闽...
一个代打!wepoke有挂(软... 一个代打!wepoke有挂(软件)透视(有挂分析)-哔哩哔哩是一款可以让一直输的玩家,快速成为一个“...