Java类结构测试的库或框架

3

我有一组类,用来检查创建的类是否符合给定的结构。我的做法是读取一个属性文件,然后将其与一个类进行比较。

例如:

className: demo.HelloWorld
classFile: demo/HelloWorld.class
methods:   public static main(java/lang.String[]) : void 
attributes: name : java.lang.String

等等,还有其他的。

在我继续进行这样的工作之前,我想知道是否有任何人知道一个库或框架来完成同样的工作。


我真的很想知道你为什么要这样做。这似乎是对DRY原则的严重违反。如果它是基于规则的(比如所有实现该接口的类都应该命名为...),我可以理解。 - Adam Gent
@Adam:当然是为了测试。我想测试一下一个类文件(.class文件)是否包含它所说的类、方法、属性等。是的,测试基本上就是“做重复的事情” :) - OscarRyz
我一定是漏掉了什么。所以你想象有人会编写这些属性文件和Java类?为什么不只是编写常规的单元测试呢?对于测试,我总是尽量选择最划算的方法,而你正在进行的合同测试水平似乎不值得。特别是因为真正的单元测试将重构并显示编译时错误,如果您重命名方法/属性。如果您只是尝试进行命名一致性,请参阅我的答案。 - Adam Gent
一个类如何声明它包含某些方法或属性,而实际上它并不包含? - matt b
4个回答

1
要做到这一点,您需要拥有一个能够解析“结构”(Java片段)并且可能能够查找所涉及类型的Java解析器。(您可以使用某些脚本语言来完成此操作,但它将非常脆弱,并且容易产生错误的负面影响,这将消耗您希望此工具节省的时间)。
我们的DMS软件重构工具包及其Java前端是具备这些功能的框架。DMS旨在使人们能够构建任意自定义工具以分析或转换源代码。 DMS提供了解析器(由所选前端定义),AST构建器,用于诸如C、C++、Java和COBOL等语言的符号表构建工具,用于以过程方式检查树和使用表面语法模式检查树的工具,这允许您直接表达代码片段(由前端解析确定)以进行代码生成或模式匹配。
对于您想要完成的任务,您需要使用DMS解析所需软件,并进行名称和类型解析(构建符号表)。然后,您需要使用DMS的模式解析器将您的“规范文件”读取为一组方法签名等,并使用名称解析器定位/查找标识符(例如,“demo.Helloworld”),找到相应的类,然后将解析的模式与方法签名进行匹配。不匹配会报告不一致性,这正是您想要的结果。

我想我可以构建一个小型DSL(实际上这就是我的.properties文件),但我不确定是否使用像DMS这样的工具会不会过度。我会找出答案的。 - OscarRyz
@OscarRyz:仅有一个用于规范的领域特定语言并不足够。如果没有真正解析Java并进行名称/类型解析的能力,我认为您将无法获得所需的内容。 - Ira Baxter

0

我有一个很好的库,内置了许多反射工具,但由于许可问题(预告!),我无法发布它。不过你可以看看这里或者这里。一旦你构建了一些基本的反射工具,事情就会很快地开始成形。


0

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接