2012-07-26 82 views
2

任何人都遇到了这个错误测试类只能有一个构造

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

使用情况。

我在TestSuite中有2个TestScripts。如果我动态创建TestSuite,然后添加2个testScript并调用它,其中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和Im中创建了测试类,并依赖于JUnit4运行我的主程序。

+0

你确定实现这些测试的类(你称它们为“testscripts”)每个都只有一个构造函数吗? – Jesper 2012-07-26 07:28:18

+0

是的,我确定。它是一个简单的junit3测试。 公共类ScriptTest扩展了TestCase { } – jantox 2012-07-26 07:33:53

+0

你能发布多一点的代码吗?包括ScriptTest构造函数?还有套件的代码。 – 2012-07-26 07:48:16

回答

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());  
} 

在此期间,想想upgradng测试用例从JUnit的3到JUnit 4中,JUnit 3中,现在已经非常老了。

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

+0

是的,我知道。但这是我构建TestSuite的唯一方法。我真的不知道如何以编程方式在JUnit4中创建TestSuite。 – jantox 2012-07-26 09:29:29

+0

感谢这个,但它引入了另一个错误。 “没有公共构造函数TestCase(String name)或TestCase()”,本网站详细介绍了http://cleveralias.blogs.com/thought_spearmints/2005/11/index。 – jantox 2012-07-26 09:38:55

相关问题