我正在尝试编写一些代码,这些代码将项目中的TestSuites递归地添加到位于包层次结构根部的一套套件中。
我已经编写了返回Collection对象的代码,该对象包含我项目中找到的每个Test Suite的File对象。
我现在正在尝试遍历它们并将它们添加到名为AllTests.java的文件中的TestSuite中:
public static Test suite() throws IOException, ClassNotFoundException {
TestSuite suite = new TestSuite();
//Code not included for getTestSuites() in this snippet.
Collection<File> testSuites = getTestSuites();
for(File f: testSuites) {
//Truncate the path of the test to the beginning of the package name
String testName = f.getAbsolutePath().substring(f.getAbsolutePath().lastIndexOf("net"));
//Replace backslashes with fullstops
testName = testName.replaceAll("\\\\", ".");
//Take the .class reference off the end of the path to the class
testName = testName.replaceAll(".class", "");
//Add TestSuite to Suite of Suites
Class<? extends Test> test = (Class<? extends Test>) AllTests.class.getClassLoader().loadClass(testName);
suite.addTest(test);
}
不幸的是,我在suite.addTest(测试)行上遇到以下编译器错误:
方法中的addTest(Test)方法 TestSuite不适用于 参数(类&lt; capture#3-of?extends Test&gt;)
我假设一个Class&lt;测试&gt;参考和测试参考是一样的吗?
答案 0 :(得分:2)
是的,你假设一个Class&lt;测试&gt;参考和测试参考是同一个。
您需要扩展Test
的类的实例,而不是定义扩展为Test
的类对象的实例(类也是java中的对象)。< / p>
答案 1 :(得分:1)
TestSuite.addTest
需要一个Test类实例;不只是一个Class对象。
如果您的测试可以(他们应该)没有参数进行实例化,您可以尝试使用Class.newInstance()
。
-
一个更好的策略是开始使用Maven;它会自动运行src / test / java源文件夹中的所有Test类。但这可能是一个相当大的改革:)。
答案 2 :(得分:1)
Class<Test>
描述了类Test
的概念 - 它的字段,方法以及定义类Test
时Java代码描述的其他内容。由于基本上只有一个Class<Test>
类,因此 (为了让类加载器不在讨论中)在JVM中有一个Test
实例。
这同样适用于每个Test
子类 - 对于每个Class<TestSubClass>
,通常会有一个TestSubClass
个实例。
另一方面,可以有任意数量的Test
个对象。
Java允许您通过针对Test
实例调用Class<Test>
,从newInstance
创建Class<Test>
个对象。所以基本上,改变你的行:
suite.addTest(test);
到
suite.addTest(test.newInstance());
处理所有可能的例外情况。
答案 3 :(得分:0)
您正在使用的方法需要Test(sub)类的实例。 您所追求的可能是addTestSuite(Class testClass),它允许添加类。