2011-09-26 9 views
15
@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}で実行されています。DataPointを理論に付けるにはどうすればいいですか?

答えて

22

データポイントは、クラスに適用される特定の@Theorysに特定@DataPointsをバインドする方法。 @Theoryメソッドがintをとり、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); 
    } 
} 

は、これは45 & 46それは "foobarに" と "BARBAR" と "foobarに" と "BARBAR" とtestString2でtestString1を呼び出すと45 & 46とTEST1、TEST2とを呼び出します。

あなたが本当に異なる理論のために異なるデータセットを使用する場合は、プライベートクラスにデータをラップすることができます

@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); 
    } 
} 

これは、これは動作します46と45とTEST2とTEST1を呼び出しますが、私の中にそれはコードを覆い隠し、Testクラスを2つのクラスに分割するより良い解決策かもしれません。

+0

@Mathew答えをありがとう。そのような拘束力のある機能はありません。当面、プライベートクラスのラッピングを使用します。しかしそれはまだエレガントではありません。私はまだDataPointsがクラスに添付されている理由を理解できませんか?彼らはメソッドレベルでより意味をなさない。 –

+0

考えられるのは、データポイントが多数あり、いくつかの理論をテストできるということです。そのためには、いくつかのテストメソッドが必要です。あなたが答えに満足しているなら、それを受け入れることができますか? –

+0

+1 Testクラスを2つのクラスに分割します。 test1とtest2が異なるデータセットを渡して意味をなす必要がある場合は、本質的に異なる動作をテストし、論理的に分離することができます。 –

1

私は行動を検証するための具体的な数値や理論のテストを使用しての話を見ている参照の一部。たとえば、属性を追加または減算するメソッドを持つクラスがある場合、テストでは結果の正当性が検証されます(たとえば1 + 3が4を返す)一方、理論では、データポイントの値(x1 、y1)、(x2、y2)、x + yyは常にxと等しく、x-y + yは常にxと等しく、x * y/yは常にxと等しくなります。データ。理論では、y == 0などのケースを除外することもできます。彼らは失敗と見なされません。結論:両方を使うことができます。良い論文は次のとおりです。JUnitの4.12 (それが導入されたときにわからない)データポイントに名前を付けて、パラメータに割り当てることが可能である(私はhttp://farenda.com/junit/junit-theories-with-datapoints/からそれを学んだ)してhttp://web.archive.org/web/20110608210825/http://shareandenjoy.saff.net/tdd-specifications.pdf

21

@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 
+1

これが受け入れられる回答である必要があります。 – Chris311

+0

@ Chris311、これはすべきですが、最新のJUnitを使用できる人のみが対象です。残念ながら、私たちは古いバージョンのIDEに悩まされていましたが、これをサポートしていない独自のJUnitライブラリを使用することを主張しています。 –

関連する問題