Junit @RunWith(Parameterized.class)

时间:2016-05-14 19:31:41

标签: junit

以下两种情况之间的差异是

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 
  }
}

2 个答案:

答案 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版本的原因是第一个IterableIterable<Integer [][]>,其维度多于第二个维度Iterable<int[]> endswith 1}}。