JUnit 4のパラメトリックテスト


最近TestNとJUnit 4の優劣を研究している.JUnit 4の@Parametersをテスト中にinitializationErrorのエラーに遭遇しました.だから、この問題の原因を徹底的に研究し、解決策を見つけたい.
問題の説明:
以前にJUnitを使用していた場合は、直接JUnit test形式でtestクラスの@Test注釈の関数を実行できます.ただしtestクラスで@RunWith(Parameterized.class)注記が使用されている場合、この実行方法ではinitializationErrorのエラーが発生します.
テストされたクラスMath:
package com.ibm.junit.parameter;

/**
 * @author [email protected]
 *
 */
public class Math {

    public static int divide(int x,int y) {   
        return x/y;   
    }   
  
    public static int multiple(int x,int y) {   
        return x*y;   
    } 
}

テストクラスMathTest:
package com.ibm.junit.parameter;

import static org.junit.Assert.assertEquals;

import java.util.Arrays;
import java.util.Collection;

import org.junit.AfterClass;
import org.junit.BeforeClass;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.Parameterized;
import org.junit.runners.Parameterized.Parameters;

/**
 * @author [email protected]
 *
 */

@RunWith(Parameterized.class)
public class MathTest {
    
    int faciend;
    int multiplicator;
    int result;

    @Parameters
    public static Collection multipleValues() {
        System.out.println("Initialize Data!");
     return Arrays.asList(new Object[][] {
        {2, 3, 6 },
        {3, 4, 12 },
        {4, 5, 20 }
     });
    }
    
    public MathTest(int faciend, int multiplicator, int result) {
        System.out.println("Constructor Method with no Parameters!");
        
        this.faciend = faciend;
        this.multiplicator = multiplicator;
        this.result = result;
    }
    
    /*public MathTest() {
        System.out.println("Constructor Method with no Parameters!");
    }*/

    @BeforeClass
    public static void setUpBeforeClass() throws Exception {
        System.out.println("Before Class!");
    }

    @AfterClass
    public static void tearDownAfterClass() throws Exception {
        System.out.println("After Class!");
    }

    @Test(expected=ArithmeticException.class)
    public void testDivide() {
        System.out.println("Test Divide");
        
        assertEquals(3,Math.divide(9,3));
        assertEquals(3,Math.divide(10,3));
        Math.divide(10,0);// 0, 
    }

    @Test
    public void testMultiple() {
        System.out.println("Test Multiple");
        
        assertEquals(result,Math.multiple(faciend,multiplicator));
    }
}

問題を分析するために、以下の比較試験を行った.
1.MathTestクラスをJUnit test形式で直接実行
MathTestクラス全体を実行すると、テストに合格し、次のように出力されます.
Initialize Data! Before Class! Constructor Method with no Parameters! Test Divide Constructor Method with no Parameters! Test Multiple Constructor Method with no Parameters! Test Divide Constructor Method with no Parameters! Test Multiple Constructor Method with no Parameters! Test Divide Constructor Method with no Parameters! Test Multiple After Class!
MathTestクラスのtestMultiple()メソッドを実行すると、テストに失敗し、initializationErrorのエラーをプロンプトします.
2.MathTestクラスの前の@RunWith(Parameterized.class)を注釈しjavaを提示する.lang.Exception: Test class should have exactly one public zero-argument constructor.注記@RunWith(Parameterized.class)の前後の違いは後で詳しく分析します.
3.2で提示されたエラーに従って、注釈にはパラメトリック関数があり、パラメトリック関数がないことを提供します.MathTestクラス全体に対してJUnitテストを行っても、testMultiple()メソッドに対してJUnitテストを行っても、合格します.
4.MathTestクラスの前の@RunWith(Parameterized.class)を加えて、依然として無パラメトリック構造関数を提供して、MathTestクラスと方法のテストに対して、すべて通じなくて、javaを提示します.lang.IllegalArgumentException:パラメータ数エラー. 
上の比較試験を通して、JUnitパラメータテストの原理と結びつけて、原因を分析してみます.
JUnitパラメトリックテストの場合、テストクラスの前に@RunWith(Parameterized.class)を付ける必要があります.@RunWithは、クラスがデフォルトのJUnitビルドのランナではなくパラメトリックランナで実行されることを指定します.@RunWith注記がない場合は、JUnitで構築されたランナを使用して実行します.パラメータなしで、自分で提供せずにデフォルトのパラメータなしで実行できます.実験3はこの問題を説明した.テストはパスしましたが、パラメータに値を付けていないため、パラメータはデフォルト値で使用されているため、無効なテストです.
@RunWith注記を使用するには、コンストラクション関数を指定する必要があります.実験4はこの問題を説明した.また、各テスト関数が実行される前に、すべてのテストデータと検証データを初期化するためにパラメトリック関数が呼び出されます.試験1の出力結果はこれを示している.
また,@RunWith注記を使用すると,テストクラス内の単一のテスト関数を単独でテストすることはできない.個々のテスト関数を単独で実行すると、テストクラスを作成する前に@Parameters注記を実行しない関数、パラメトリックテストにパラメータを提供できないため、initializationErrorのエラーが表示されます.テストクラスをテストすると、テストクラスを作成する前にテストデータを準備し、各テスト関数を実行する前に、コンストラクション関数を使用してテスト関数に使用するテスト変数に値を割り当てます.試験1の出力結果はこれを示している.