18
@DataPoints public static final Integer[] input1={1,2};
@Theory
@Test
public void test1(int input1){

}

@DataPoints public static final Integer[] input2={3,4};
@Theory
@Test
public void test2(int input2 ){

}

test1がデータセットinput1-{1,2}で実行され、test2がinput2-{3,4}で実行されるようにします。ただし、現在、各テストは両方のデータセット{1,2,3,4}で実行されています。特定の@DataPointsを特定の@Theorysにバインドする方法

4

4 に答える 4

31

JUnit 4.12 (いつ導入されたかはわかりません)を使用すると、DataPointに名前を付けてパラメーターに割り当てることができます(http://farenda.com/junit/junit-theories-with-datapoints/から学習しました)。

    @RunWith(Theories.class)
    public class TheoriesAndDataPointsTest {
        @DataPoints("a values")
        public static int[] aValues() {
            return new int[]{1, 2};
        }

        @DataPoints("b values")
        public static int[] bValues() {
            return new int[]{3, 4};
        }

        @Theory
        public void theoryForA(@FromDataPoints("a values") int a) {
            System.out.printf("TheoryForA called with a = %d\n", a);
        }

        @Theory
        public void theoryForB(@FromDataPoints("b values") int a) {
            System.out.printf("TheoryForB called with b = %d\n", a);
        }
    }

出力:

TheoryForA called with a = 1
TheoryForA called with a = 2
TheoryForB called with b = 3
TheoryForB called with b = 4
于 2016-03-17T09:59:23.470 に答える
23

DataPointsはクラスに適用されます。intを受け取る@Theoryメソッドがあり、intの配列であるDataPointがある場合、それはintで呼び出されます。

@RunWith(Theories.class)
public class TheoryTest {
    @DataPoint public static int input1 = 45;
    @DataPoint public static int input2 = 46;
    @DataPoints public static String[] inputs = new String[] { "foobar", "barbar" };

    @Theory public void testString1(String input) {
        System.out.println("testString1 input=" + input);
    }

    @Theory public void testString2(String input) {
        System.out.println("testString2 input=" + input);
    }

    @Theory public void test1(int input) {
        System.out.println("test1 input=" + input);
    }

    @Theory public void test2(int input) {
        System.out.println("test2 input=" + input);
    }
}

これは、test1を45と46で呼び出し、test2を45と46で呼び出します。testString1を「foobar」と「barbar」で呼び出し、testString2を「foobar」と「barbar」で呼び出します。

理論ごとに異なるデータセットを実際に使用したい場合は、データをプライベートクラスでラップできます。

@RunWith(Theories.class)
public class TheoryTest {
    public static class I1 { int i; public I1(int i) { this.i = i;} }
    public static class I2 { int i; public I2(int i) { this.i = i;} }

    @DataPoint public static I1 input1 = new I1(45);
    @DataPoint public static I2 input2 = new I2(46);

    @Theory
    public void test1(I1 input) {
        System.out.println("test1 input=" + input.i);
    }

    @Theory
    public void test2(I2 input) {
        System.out.println("test2 input=" + input.i);
    }
}

これにより、test1が45で、test2が46で呼び出されます。これは機能しますが、私の意見では、コードが不明瞭になり、Testクラスを2つのクラスに分割する方がよい場合があります。

于 2011-09-26T14:17:51.570 に答える
3

GáborLiptákの回答を参照すると、名前付きデータポイントは静的フィールド(参照)として定義でき、より簡潔なコードが得られます。

    @RunWith(Theories.class)
    public class TheoriesAndDataPointsTest {
        @DataPoints("a values")
        public static int[] aValues = {1, 2};

        @DataPoints("b values")
        public static int[] bValues = {3, 4};

        @Theory
        public void theoryForA(@FromDataPoints("a values") int a) {
            System.out.printf("TheoryForA called with a = %d\n", a);
        }

        @Theory
        public void theoryForB(@FromDataPoints("b values") int a) {
            System.out.printf("TheoryForB called with b = %d\n", a);
        }
    }
于 2018-04-24T06:43:13.947 に答える
1

私が見た参考文献のいくつかは、特定の値のテストと動作を検証するための理論の使用について話していました。例として、属性に加算および減算するメソッドを持つクラスがある場合、テストは結果の正しさを検証します(たとえば、1 + 3は4を返します)が、理論はデータポイント値(x1 、y1)、(x2、y2)、x + yyは常にxに等しく、x-y + yは常にxに等しく、x * y / yは常にxに等しいなど。このように、理論の結果はデータ。理論を使用すると、y==0などのケースを除外することもできます。それらは失敗としてカウントされません。結論:両方を使用できます。良い論文は次のとおりです:http://web.archive.org/web/20110608210825/http ://shareandenjoy.saff.net/tdd-specifications.pdf

于 2015-03-18T19:29:15.217 に答える