5

パラメータ化できるようにしたい JUnit 3.x TestCase があります。TestCase全体(フィクスチャを含む)をパラメータ化したいと思います。ただし、このTestSuite.addTestSuite()メソッドではTestCaseオブジェクトを渡すことはできず、クラスのみを渡すことができます。

   TestSuite suite = new TestSuite("suite");
   suite.addTestSuite(MyTestCase.class);

テストの実行時に作成される MyTestCase インスタンスにパラメーター (文字列) を渡すことができるようにしたいと考えています。現在のように、パラメーター値ごとに個別のクラスを用意する必要があります。

私はそれを無名のサブクラスに渡そうとしました:

   MyTestCase testCase = new MyTestCase() {
       String getOption() {
           return "some value";
       }
   }

   suite.addTestSuite(testCase.getClass());

ただし、これはアサーションで失敗します。

   ... MyTestSuite$1 has no public constructor TestCase(String name) or TestCase()`

何か案は?問題を間違った方法で攻撃していますか?

4

5 に答える 5

3

これが Java 5 以降の場合は、パラメーター化されたテスト ケースが組み込まれている JUnit 4 への切り替えを検討することをお勧めします。

于 2008-10-13T12:21:06.410 に答える
3

テスト対象の複数/異なるバックエンド用にパラメーター化されたテスト ケースを作成するのではなく、テスト ケースを抽象化することを検討します。API の新しい実装ごとに、実装する TestCase クラスを提供する必要があります。

現在、次のようなテストメソッドがある場合

public void testSomething() {
   API myAPI = new BlahAPI();
   assertNotNull(myAPI.something());
}

使用する特定の API オブジェクトを返す抽象メソッドを TestCase に追加するだけです。

public abstract class AbstractTestCase extends TestCase {
    public abstract API getAPIToTest();

    public void testSomething() {
       API myAPI = getAPIToTest();
       assertNotNull(myAPI.something());
    }

    public void testSomethingElse() {
       API myAPI = getAPIToTest();
       assertNotNull(myAPI.somethingElse());
    }
}

次に、テストする新しい実装の TestCase は、AbstractTestCase を実装し、API クラスの具体的な実装を提供するだけで済みます。

public class ImplementationXTestCase extends AbstractTestCase{

    public API getAPIToTest() {
        return new ImplementationX();
    }
}

次に、抽象クラスで API をテストするすべてのテスト メソッドが自動的に実行されます。

于 2008-10-13T14:00:54.790 に答える
1

IDE 内のテストの名前がパラメーター セット間で同じであるなど、いくつかの詳細は完全ではありません (JUnit 4.x では [0]、[1]、... が追加されます)。

これを解決するには、 getName() を上書きして、テスト ケース クラスのコンストラクターを変更するだけです。

 private String displayName;

 public ParameterizedTest(final int value) {
     this.value = value;
     this.displayName = Integer.toString(value);
 }

 @Override
 public String getName() {
     return super.getName() + "[" + displayName + "]";
 }
于 2011-02-21T07:26:03.680 に答える