5

誰もがこのエラーに遭遇しました

initializationError(junit.framework.TestSuite): テスト クラスは 1 つのコンストラクターのみを持つことができます

使用事例。

TestSuite に 2 つの TestScript があります。TestSuite を動的に作成し、2 つの testScript を追加してこれを呼び出すと、

Result result = JUnitCore.runClasses(clazz);

clazz は TestSuite クラスです。

ただし、2 つの TestScript ごとに JUnitCore.runClasses を呼び出しても問題はありません。

JUnit3を使用しました。

この JUnit エラーで同様の質問があります - IllegalArgumentException:Test クラスはコンストラクターを 1 つしか持つことができませんが、私の場合はテスト スイート クラスを動的に作成する必要があります。理由は、テストスイートに 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にも依存するメインプログラムを実行しています。

4

2 に答える 2

1

クラスjunit.framework.TestSuite.classをJUnitCore.runClasses()に渡しています。JUnitCore.runClasses はクラスのインスタンス化を試みます。問題を回避するには、渡すクラスにコンストラクターが 1 つだけ含まれている必要があります [*]。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 のユースケースでは、それは当てはまります。

于 2012-07-26T08:59:52.983 に答える