我在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)
我不了解这些数据结构足以自己解决这个问题,所以任何帮助都会非常感激。
答案 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问题,但是作为一个疯狂的猜测,它可能也是由你测试的没有空构造函数的类引起的问题?