测试类只能有一个构造函数

时间:2012-07-26 07:04:15

标签: java eclipse junit

有人遇到此错误

initializationError(junit.framework.TestSuite):测试类只能有一个构造函数

用例。

我在TestSuite中有2个TestScripts。如果我动态创建TestSuite然后添加2个testScripts并调用此

Result result = JUnitCore.runClasses(clazz);

其中clazz是TestSuite类。

但是,如果在每个2个TestScripts上调用JUnitCore.runClasses,则没有问题。

我使用了JUnit3。

我对此JUnit error - IllegalArgumentException:Test class can only have one constructor有类似的问题,但我的是动态创建测试套件类。原因是有一个用例,我可以在测试套件中包含1个测试脚本,或者我可以在测试套件中有2个测试脚本。

更新代码:

public class ScriptTest1 extends TestCase { 
    private ScriptTest1() { }   
    public void testMethod1() {
        Assert.assertEquals(true, true);
    }
}

public class ScriptTest2 extends TestCase { 
    private ScriptTest2() { }   
    public void testMethod2() {
        Assert.assertEquals(true, true);
    }
}

然后在另一个班级

File file = new File("file to ScriptTest.class");
Class<?> clazz = Class.forName(className, true, Thread.currentThread().getContextClassLoader());

//construct a new test suite
TestSuite ts = new TestSuite("Sample Test Suite with only ScriptTest1");
ts.addTestSuite((Class<? extends TestCase>) clazz);

Result result = JUnitCore.runClasses(ts.getClass());
HashSet<String> failureMethod = new HashSet<String>();
for (Failure failure : result.getFailures()) {
     System.out.println("Failure: " + failure.toString());      
}

失败将输出:initializationError(junit.framework.TestSuite):测试类只能有一个构造函数 但是,如果我直接执行此操作,它将运行良好。

File file = new File("file to ScriptTest.class");
Class<?> clazz = Class.forName(className, true, Thread.currentThread().getContextClassLoader());
Result result = JUnitCore.runClasses(clazz);

我在JUnit4中创建了测试类,并且运行我的主程序也依赖于JUnit4。

2 个答案:

答案 0 :(得分:1)

您正在将类junit.framework.TestSuite.class传递给JUnitCore.runClasses()。 JUnitCore.runClasses尝试实例化该类。为避免出现问题,它要求您传递的任何类只有一个构造函数[*]。 TestSuite有多个公共构造函数。

尝试:

TestResult result = new TestResult();
ts.run(result);

for (Enumeration<TestFailure> failures = result.failures(); failures.hasMoreElements();) {
    TestFailure testFailure = failures.nextElement();
    System.out.println("Failure: " + testFailure.toString());      
}

与此同时,考虑将您的测试用例从JUnit 3升级到JUnit 4,JUnit 3现在已经很老了。

[*]除了参数化测试等。在OP的用例中,它是真的。

答案 1 :(得分:0)

在您的测试类中,如果您正在注入依赖项,private final Whatever whatever;

擦除 final 并擦除构造函数。

这对我有用