gpt4 book ai didi

java - 数组列表到 Collection
转载 作者:太空宇宙 更新时间:2023-11-04 06:20:55 24 4
gpt4 key购买 nike

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

我发现为输入创建一个 object[] 的示例代码如下:

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

我对这些数据结构的理解还不足以自己解决这个问题,因此我们将不胜感激。

最佳答案

您的代码没有按照测试需要的方式创建 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;
}

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

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

关于java - 数组列表到 Collection<Object>,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27427254/

24 4 0