2009-07-30 22 views
6

パラメータ化されたクラスで実行されているjunitテストクラスで、@Parametersで複数のメソッドを使用できますか? JVMが最初junit4を与え方1Junit 4の@parameters

@RunWith(value = Parameterized.class) 
public class JunitTest6 { 

private String str; 

public JunitTest6(String region, String coverageKind, 
     String majorClass, Integer vehicleAge, BigDecimal factor) { 
    this.str = region; 
} 

    @Parameters 
public static Collection<Object[]> data1() { 
    Object[][] data = {{some data}} 

    return Arrays.asList(data); 
} 

@Test 
public void pushTest() { 
    System.out.println("Parameterized str is : " + str); 
    str = null; 
} 

@Parameters 
public static Collection<Object[]> data() { 
    Object[][] data = {{some other data}} 
    return Arrays.asList(data); 
} 

@Test 
public void pullTest() { 
    System.out.println("Parameterized new str is : " + str); 
    str = null; 
} 
} 

答えて

2

異なるパラメータをさまざまな方法に渡すには、Theoriesランナー(そのリンクの単語理論を検索)を使用できます。

+0

はい、これは解決策になります、ありがとうございますYishai。 – ravinikam

+0

http://blogs.oracle.com/jacobc/entry/junit_theoriesによれば、あなたは... – dm76

+0

@ dm76、あなたのリンクは質問者が尋ねたことをやっているようです(複数のデータポイントが複数のパラメータメソッドの代わりになります)、私はあなたのコメントを理解するナットですか? – Yishai

2

おそらくdata1方法、それの保証は、それが使用します。

ここでのJUnitから該当するコードです:

private FrameworkMethod getParametersMethod(TestClass testClass) throws Exception { 
    List<FrameworkMethod> methods= testClass.getAnnotatedMethods(Parameters.class); 
    for (FrameworkMethod each : methods) { 
     int modifiers= each.getMethod().getModifiers(); 
      if (Modifier.isStatic(modifiers) && Modifier.isPublic(modifiers)) 
       return each; 
    } 

    throw new Exception("No public static parameters method on class " + testClass.getName()); 
} 

だから、最初の公開は、それが見つかった静的なアノテーション付きメソッドが使用されますが、それはどのような順序でそれらを見つけることができます。

なぜあなたはそのように書かれた質問をしていますか?あなたは1つだけ@Parametersの方法を注記する必要があります。

+0

ありがとう、スカフマン。実際には、私はテストの2つの異なる動作が有効であることを望んでおり、同じテストクラスでは異なるメソッドを使用しています。 – ravinikam

+0

ああ。もしあなたが熱心であれば、独自のテストランナーの実装を書くことができます(パラメータ化されたソースをコピーして独自に変更する)が、組み込みのParameterizedランナーは非常に粗末です。 – skaffman

+0

うーん、とにかくありがとう。 – ravinikam

2

複数のデータメソッドを持つようには指定されていません。 skaffman's answerにそれを見ることができます。

2つのデータメソッドを実装するために提供されていないのはなぜですか?
答えは次のとおりです。カップリング。

このテストを2つのテストケースに分割するのは複雑すぎますか?あなたは小さな継承を導入し、共通の方法を共有することができます。 2つのテストケースを使用すると、2つの分離されたデータメソッドを提供し、あなたのものをうまくテストできます。

私はそれが役に立ちそうです。

+0

テストケースを分けるために簡単に実現できます。ご返信ありがとうございます。実際、私はTestNGが使用するのと同じ方法を探していました。各メソッドのデータプロバイダを提供していました。 – ravinikam

+0

upvoteが私を慰めてくれる;) – guerda

1

同じパラメータで動作するメソッドのセットごとに、内部クラスを作成できます。例:

public class JunitTest6 { 

@RunWith(value = Parameterized.class) 
public static class PushTest{ 
    private String str; 
    public PushTest(String region) { 
    this.str = region; 
    } 

    @Parameters 
    public static Collection<Object[]> data() { 
    Object[][] data = {{some data}} 

    return Arrays.asList(data); 
    } 

    @Test 
    public void pushTest() { 
    System.out.println("Parameterized str is : " + str); 
    str = null; 
    } 
} 

@RunWith(value = Parameterized.class) 
public static class PullTest{ 
    private String str; 
    public PullTest(String region) { 
    this.str = region; 
    } 

    @Parameters 
    public static Collection<Object[]> data() { 
    Object[][] data = {{some other data}} 
    return Arrays.asList(data); 
    } 

    @Test 
    public void pullTest() { 
    System.out.println("Parameterized new str is : " + str); 
    str = null; 
    } 
} 
} 
+0

これは私のためには機能しませんでした。 – pts

+0

外部クラスの前に['@RunWith(Enclosed.class)'](http://junit.org/junit4/javadoc/latest/org/junit/experimental/runners/Enclosed.html)を追加する必要があります。 – sebokopter