数组列表到Collection <object> </object>

时间:2014-12-11 16:05:02

标签: java selenium-webdriver

我在Java中遇到数据结构问题。我正在尝试编写参数化的硒测试,因为我需要测试将不同的数据添加到同一个字段。我的想法是我从一个文件中逐行读取数据集,这就成了我测试的输入。

我发现的示例代码为输入创建了一个对象[],如下所示:

    @Parameters
    public static Collection<Object[] > data(){
    Object[][] data = new Object[][] { {"1"}, {"JU"}, {"JUnit Parallel"}};
    return Arrays.asList(data);
}

我想从文件中读取我的数据,如下所示:

        @Parameters
    public static Collection<Object[] > data() throws IOException{

        Scanner s = new Scanner(new File("/home/users/me/myfile"));
        ArrayList<String> list = new ArrayList<String>();
        while (s.hasNext()){
            list.add(s.next());
        }
        s.close();
        Object[][] data = new Object[][] {list.toArray()};
        return Arrays.asList(data);
    }

这会引发以下错误:

java.lang.IllegalArgumentException: wrong number of arguments
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:57)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
at java.lang.reflect.Constructor.newInstance(Constructor.java:532)
at org.junit.runners.Parameterized$TestClassRunnerForParameters.createTestUsingConstructorInjection(Parameterized.java:186)
at org.junit.runners.Parameterized$TestClassRunnerForParameters.createTest(Parameterized.java:181)
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:50)
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:675)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:382)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:192)

我不了解这些数据结构足以自己解决这个问题,所以任何帮助都会非常感激。

2 个答案:

答案 0 :(得分:1)

您的代码不会以测试需要的方式创建2D数组:而不是创建N×1数组,它会创建一个1×N数组。

假设您的文件包含以下文字:

1
JU
JUnit_Parallel

然后你的代码会创建一个看起来像这个

的对象数组
new Object[][] { {"1", "JU", "JUnit_Parallel"} };

不喜欢这个

new Object[][] { {"1"}, {"JU"}, {"JUnit_Parallel"}};

要解决此问题,请按以下步骤更改您的代码:

@Parameters
public static Collection<Object[]> data() throws IOException{
    Scanner s = new Scanner(new File("/home/users/me/myfile"));
    ArrayList<Object[]> list = new ArrayList<Object[]>();
    while (s.hasNext()){
        list.add(new Object[] { s.next() });
    }
    s.close();
    return list;
}

现在假设您的参数化测试方法只采用IllegalArgumentException类型的一个参数,String错误就会消失:

@Test
public void testFindElements(String arg) {
    ...
}

答案 1 :(得分:0)

您发布的堆栈跟踪中没有任何地方引用您的代码,因此您发布的代码实际上没用。看起来这可能是一个JUnit问题,但是作为一个疯狂的猜测,它可能也是由你测试的没有空构造函数的类引起的问题?