2017-06-13 17 views
1

パラメータを生成するJUnit 4.11でパラメータ化されたテストをセットアップしようとしました。ただし、このパラメータは配列そのものである必要があります。配列パラメータを使用したパラメータ化されたJUnitテストのリフレクション

次のコードのための予想される動作は、argumentsが最初の実行で配列{"test1", "test2"}とセカンドランの配列{"test3", "test4"}を保持しながらtest()が二度実行されることであろう。

@RunWith(Parameterized.class) 
public class Tester { 

    @Parameter 
    private String[] arguments; 

    @Parameters 
    public static Iterable<Object[]> data() { 
     return Arrays.asList(
       new Object[][]{ 
        {new String[] {"test1","test2"}}, 
        {new String[] {"test3","test4"}} 
       } 
     ); 
    } 

    @Test 
    public void test() { 
     fail(); 
    } 
} 

ただし、テストを実行すると、SlowCheckMemberAccess例外がスローされます。 Googleはそのような問題に対して何の結果ももたらさなかった。

ここで間違っていることは誰でも説明できますか?

フィルタリングされていないJUnitのトレースは次のとおりです。

java.lang.IllegalAccessException: Class org.junit.runners.Parameterized$TestClassRunnerForParameters can not access a member of class org.mafagafogigante.dungeon.entity.creatures.Tester with modifiers "private" 
at sun.reflect.Reflection.ensureMemberAccess(Unknown Source) 
at java.lang.reflect.AccessibleObject.slowCheckMemberAccess(Unknown Source) 
at java.lang.reflect.AccessibleObject.checkAccess(Unknown Source) 
at java.lang.reflect.Field.set(Unknown Source) 
at org.junit.runners.Parameterized$TestClassRunnerForParameters.createTestUsingFieldInjection(Parameterized.java:201) 
at org.junit.runners.Parameterized$TestClassRunnerForParameters.createTest(Parameterized.java:179) 
at org.junit.runners.BlockJUnit4ClassRunner$1.runReflectiveCall(BlockJUnit4ClassRunner.java:244) 
at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12) 
at org.junit.runners.BlockJUnit4ClassRunner.methodBlock(BlockJUnit4ClassRunner.java:241) 
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:70) 
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:50) 
at org.junit.runners.ParentRunner$3.run(ParentRunner.java:238) 
at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:63) 
at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:236) 
at org.junit.runners.ParentRunner.access$000(ParentRunner.java:53) 
at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:229) 
at org.junit.runners.ParentRunner.run(ParentRunner.java:309) 
at org.junit.runners.Suite.runChild(Suite.java:127) 
at org.junit.runners.Suite.runChild(Suite.java:26) 
at org.junit.runners.ParentRunner$3.run(ParentRunner.java:238) 
at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:63) 
at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:236) 
at org.junit.runners.ParentRunner.access$000(ParentRunner.java:53) 
at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:229) 
at org.junit.runners.ParentRunner.run(ParentRunner.java:309) 
at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:86) 
at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38) 
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:459) 
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:678) 
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:382) 
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:192) 
+0

:スタックトレースを投稿! – Seelenvirtuose

+2

"... org.mafagafogigante.dungeon.entity.creatures.HeroTestのメンバにアクセスできません修飾子_private_" ...何か不明ですか? – Seelenvirtuose

+1

ああ、私はいつも、 "フィルタトレース"をEclipseのいくつかの失敗トレースで起動していました。それが私の混乱の原因です。完全な痕跡を見ると、間違いは明らかです。その広範なヒントありがとうございます。この例を正しく反映するようにトレースを編集しました。 – Johnson

答えて

4

@Parameterで注釈が付けられたフィールドは、publicである必要があります。

JUnit 4.13 will have an improved error message:いつものように

Cannot set parameter 'arguments'. Ensure that the field 'arguments' is public. 
+0

これは私が@Seelenvirtuoseのコメントをよく見ていることに気づいたものです。両方のおかげで! – Johnson

-2

私は配列は、あまりにも、Iterableあるとして、あなたがArrays.asList()を必要としないと思います。

また、Arrays.asList()は、1つの配列引数を指定するとだますことができます。それを使用する場合は、明示的キャストを追加してください。

+0

配列は 'Iterable'インタフェースの実装として使うことができるという意味で反復可能ではありません。ここで議論が見つかりました:https://stackoverflow.com/questions/1160081/why-is-an-array-not-assignable-to-iterable。記法は、JUnitのWebサイト(https://github.com/junit-team/junit4/wiki/Parameterized-tests)から直接取得します。 – Johnson

関連する問題