【问题标题】:Test class can only have one constructor测试类只能有一个构造函数
【发布时间】:2012-07-26 07:04:15
【问题描述】:

有人遇到过这个错误

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

用例。

我在一个 TestSuite 中有 2 个测试脚本。如果我动态创建 TestSuite,然后添加 2 个 testScripts 并调用它

Result result = JUnitCore.runClasses(clazz);

其中 clazz 是 TestSuite 类。

但是,如果我在每 2 个 TestScript 上调用 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): Test class can only have one constructor 但是,如果我直接这样做,它会运行良好。

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

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

【问题讨论】:

  • 你确定实现测试的类(你称它们为“testscripts”)每个都有不超过一个构造函数吗?
  • 是的,我确定。它是一个简单的junit3测试。公共类 ScriptTest 扩展 TestCase { }
  • 你能多贴一点代码吗?包括 ScriptTest 构造函数?以及套件的代码。

标签: java eclipse junit


【解决方案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的用例中是这样的。

【讨论】:

  • 是的,我知道。但这是我构建 TestSuite 的唯一方法。我真的不知道如何在 JUnit4 中以编程方式创建 TestSuite。
  • 谢谢你,但是它引入了另一个错误。 “没有公共构造函数TestCase(String name)或TestCase()”,本站详细讨论cleveralias.blogs.com/thought_spearmints/2005/11/index
【解决方案2】:

在你的测试类中,如果你要注入依赖,private final Whatever whatever;

擦除final 并擦除构造函数。

这对我有用

【讨论】:

  • OP 代码 sn-p 似乎没有显示依赖注入。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-09-29
  • 2017-03-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多