简体   繁体   English

使用数组参数在参数化JUnit测试中的反射异常

[英]Reflection Exception in parameterized JUnit test using array parameter

I tried to setup a parameterized test in JUnit 4.11 which generates a single parameter. 我试图设置在4.11的JUnit一个参数测试,其生成一个单一的参数。 This parameter, however, needs to be an array itself. 但是,此参数必须是数组本身。

The expected behavior for the following code snippet would be that test() is run twice while arguments holds an array {"test1", "test2"} in the first run and an array {"test3", "test4"} in the second run. 以下代码片段的预期行为是test()运行两次,而arguments在第一次运行中保存数组{"test1", "test2"} ,在第二次运行中保存数组{"test3", "test4"}跑。

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

When I execute the test, however, a SlowCheckMemberAccess Exception is thrown. 但是,当我执行测试时,会抛出SlowCheckMemberAccess异常。 Google delivered no results for that kind of problem. Google没有针对此类问题提供任何结果。

Can anyone explain what is going wrong here? 任何人都可以解释这里出了什么问题吗?

The unfiltered JUnit trace is: 未经过滤的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)

The field that is annotated with @Parameter has to be public . 使用@Parameter注释的字段必须是public

JUnit 4.13 will have an improved error message : JUnit 4.13将有一个改进的错误消息

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

I do not think you need Arrays.asList() as arrays are Iterable , too. 我不认为你需要Arrays.asList()作为数组Iterable ,太。

Also Arrays.asList() can be fooled if you specify a single array argument to it. 如果Arrays.asList()指定单个数组参数,也可以欺骗Arrays.asList() If you want to use it, add explicit cast. 如果要使用它,请添加显式强制转换。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM