以下两种情况之间的差异是
A>变量的类型' arr'。在第一种情况下,它的类型是Integer [],而在第二种情况下,它的类型是int []。
B个我们可以看到我在哪里标记为" //这里"在案例1中它需要Integer [] [] []。而在案例2中,它需要int [] []。
案例1和案例2都有效。所以我的问题来了:
为什么Junit要求在测试数据为1维整数数组的情况下,在case 1中的data()方法中返回3维整数数组。 我预计它应该是2维的整数数组,因为在情况2中我在data()方法中返回一个2维数组的int数组,它很容易理解它并且它有效。但是当我尝试在case 1中的data()方法中返回2维的Integer数组作为
时 @Parameterized.Parameters(name = "test with {index}")
public static Iterable<Integer[]> data() {
return Arrays.asList(new Integer[][]{
{3, 1, 4, 6, 7, 9},
{9, 8, 7, 6, 5, 4},
});
}
Junit报道&#34; java.lang.IllegalArgumentException:错误的参数数量&#34;。如果你知道原因,请帮助我。
我搜索了Junit文档和许多其他页面而没有满意的答案。 请帮忙。我的Junit版本是4.12。
案例1
@RunWith(Parameterized.class)
public class MyTest {
@Parameterized.Parameters(name = "test with {index}")
public static Iterable<Integer[][]> data() {
//here: My question is why it can not be Integer[][]
return Arrays.asList(new Integer[][][]{
{{3, 1, 4, 6, 7, 9}},
{{9, 8, 7, 6, 5, 4}},
});
}
private Integer[] arr;
public MyTest(Integer[] arr) {
this.arr = arr;
}
public methodTest(int[] arr) {
// ignore the code here
}
}
案例2
@RunWith(Parameterized.class)
public class MyTest {
@Parameterized.Parameters(name = "test with {index}")
public static Iterable<int[]> data() {
//here int[][] works
return Arrays.asList(new int[][]{
{3, 1, 4, 6, 7, 9},
{9, 8, 7, 6, 5, 4},
}
private int[] arr;
public MyTest(int[] arr) {
this.arr = arr;
}
public methodTest(int[] arr) {
// ignore the code here
}
}
答案 0 :(得分:1)
数据本身应始终与构造函数所期望的数据类型相同,而不是通过测试。你在data()
的结构和数据本身之间也有点迷失。我更喜欢以下结构,它清楚地表达了我们需要的东西:
@Parameters
public static Collection<Object[]> data()
{
return Arrays.asList(
new Object[][]
{
{/* case 1*/},
{/* case 2*/},
}
);
}
也许这不是最短的方式,但即使是复杂的数据,你也永远不会迷失它。除了/* case 1*/
和/* case 1*/
之外,此处的每一行都不会更改。在顶层,我们有一个数组集合(类型为object),我们通过提供一个二维的对象数组来创建这个集合,每行代表测试用例。
因此案例1 将成为
@Parameterized.Parameters(name = "test with {index}")
public static Collection<Object[]> data() {
return Arrays.asList(
new Object[][]
{
{new Integer[]{3, 1, 4, 6, 7, 9}}, // here
{new Integer[]{9, 8, 7, 6, 5, 4}}, // here
}
);
}
和案例2 将成为
@Parameterized.Parameters(name = "test with {index}")
public static Collection<Object[]> data() {
return Arrays.asList(
new Object[][]
{
{new int[]{3, 1, 4, 6, 7, 9}}, // here
{new int[]{9, 8, 7, 6, 5, 4}}, // here
}
);
}
您还需要在代码中修复其他一些有问题的行,例如:测试中没有返回类型。以下是完整的可运行和通过测试的示例:
package x;
import java.util.Arrays;
import java.util.Collection;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.Parameterized;
@RunWith(Parameterized.class)
public class MyTest
{
@Parameterized.Parameters(name = "test with {index}")
public static Collection<Object[]> data() {
return Arrays.asList(
new Object[][]
{
{new Integer[]{3, 1, 4, 6, 7, 9}}, // here
{new Integer[]{9, 8, 7, 6, 5, 4}}, // here
});
}
private Integer[] arr;
public MyTest(Integer[] arr) {
this.arr = arr;
}
@Test
public void methodTest() {
// test some logic
System.out.println(arr.length);
}
}
答案 1 :(得分:0)
您的Integer
版本需要的维度多于int
版本的原因是第一个Iterable
为Iterable<Integer [][]>
,其维度多于第二个维度Iterable<int[]>
endswith
1}}。