测试所有用Java实现接口的类
是否有任何东西(专门针对Java)可以让我们自动测试接口的行为?例如,假设我对Comparable接口进行了大量测试,这些测试应适用于所有实现Comparable的测试。我想要的是能够为实现Comparable的我的任何类的测试装置自动包含" ComparableTests"。如果适用于通用接口,则有加分。
我知道.NET框架mbUnit具有类似的功能,当我们使用诸如TestNG的生成器功能之类的东西时,我们可以为Comparable设置测试夹具,并让生成器为实现Comparable的每个类创建一个实例。但是我宁愿它是自动的,并且位于每个班级的测试夹具上(因为我已经可以使用它们来测试班级的其他部分了)。
澄清:我绝对可以构建这样的东西。我在问是否有任何东西已经启用了此功能。
解决方案
在.NET中,设置一种通过程序集查找并标识每个类的继承/实现层次结构的方法将非常简单。如果我们研究Java反射API,我敢肯定我们也可以用Java做到这一点。
然后,我们可以创建一个ITargetInterface数组,并在每个数组上调用一个测试方法。
一种方法是在jar文件中搜索所有.class文件(或者在classes目录中搜索),使用Class.forName()方法加载类文件并检查MyInterface.class.isAssignableFrom(myClass)。
这不会轻易处理公共内部静态类(我们可以解析类文件名),但是永远无法与私有内部类或者匿名内部类一起使用。
根据最后一段,我们正在尝试做的是在单元测试中注入一些"额外的方法",因为我们已经在测试特定的类。我不知道允许我们根据类的层次结构添加测试的测试工具。
但是,根据我们自己的建议,使用TestNG构建类似内容,我认为我们可能非常接近。我们可以很好地合并一些基本代码,以将类添加到"默认测试类"列表中,如果它们实现了特定的接口,则将对其进行测试。
不过,就一般情况而言,我认为我们不走运,因为Java类型系统是单向的,所以我们只能(轻松地)找出类实现的接口,而不能反过来。此外,问题是"到哪里去寻找地方":如果我们有一个检查所有"可比"实现者的测试,我们是否也希望它也检查" String"的实现者的有效性,因为这在Java环境中?
试试这个
http://www.xmlizer.biz/java/classloader/ClassList.java