如何用ArchUnit断言对象实例提供的公开API方法?
能否用ArchUnit断言对象实例的公开API方法?
ArchUnit核心是做静态代码结构分析,它的断言逻辑基于类的字节码/源代码,而非运行时的对象实例。所以你直接针对Api实例做方法存在性断言的写法,ArchUnit本身不支持。
不过换个思路:对象实例的公开方法本质就是其对应类的公开方法,如果你要验证的是Api类(而非某个特定实例)是否拥有指定的公开方法,ArchUnit完全可以做到,示例代码如下:
// 用ArchUnit断言Api类的公开方法 ArchRule rule = classes() .that().areAssignableTo(Api.class) .should().havePublicMethodNamed("foo") .andShould().notHavePublicMethodNamed("bar"); rule.check(Api.class);
如果你的需求确实是针对运行时实例(比如考虑动态代理、字节码增强后的实例方法),那ArchUnit就不适用了,此时可以直接用Java反射API来实现:
Api api = Api.create(); Class<?> apiClass = api.getClass(); // 断言存在公开方法foo assertNotNull(apiClass.getMethod("foo")); // 断言不存在公开方法bar assertThrows(NoSuchMethodException.class, () -> apiClass.getMethod("bar"));
内容的提问来源于stack exchange,提问作者armandino
相关产品推荐
相关产品推荐

