组织期待异常的junit测试

时间:2013-08-31 08:05:57

标签: java unit-testing junit4

我有一个内部使用2D数组的类,并公开了一个processItem(int i,int j)方法,如下所示。该方法使用基于1的索引,并且具有一个构造函数,该构造函数将int值(比如N)作为2D数组大小。因此,对于N = 10,i和j的值应为1到N.如果使用i或j小于1或大于10调用该方法,则该方法将抛出IndexOutOfBoundsException。

在我的单元测试中,我想用i,j值调用方法

(0,4),(11,3),(3,0),(3,11)

并且这些调用应抛出IndexOutOfBoundsException

如何组织测试,是否必须为每个i,j对编写1个单独的测试?或者有更好的方法来组织它们吗?

class MyTest{
  MyTestObj testobj;
  public MyTest(){
      testobj = new MyTestObj(10);
  }
  @Test(expected=IndexOutOfBoundsException.class)
  public void test1(){
      testobj.processItem(0,4);
  }

  @Test(expected=IndexOutOfBoundsException.class)
  public void test2(){
      testobj.processItem(11,3);
  }

  @Test(expected=IndexOutOfBoundsException.class)
  public void test3(){
      testobj.processItem(3,0);
  }

  @Test(expected=IndexOutOfBoundsException.class)
  public void test4(){
      testobj.processItem(3,11);
  }
..
}

2 个答案:

答案 0 :(得分:1)

如果它们是完全独立的,那么编写独立的测试,但如果它们密切相关(看起来像它)那么只需要一次测试四次调用,每次调用都包含在try-catch中,并且{{1}每次通话后。正如在junit 3中所做的那样。

答案 1 :(得分:1)

而不是仅为指定测试方法的单独参数创建单独的方法。使用JUnit Parameterized Test。以下是Fibonacci系列的一个例子。

因此,您可以在实现中使用它,并期望ArrayIndexOutOfBounds用于单个测试方法。

@RunWith(Parameterized.class)
public class FibonacciTest {
    @Parameters
    public static Collection<Object[]> data() {
        return Arrays.asList(new Object[][] {
                Fibonacci,
                { { 0, 0 }, { 1, 1 }, { 2, 1 }, { 3, 2 }, { 4, 3 }, { 5, 5 },
                        { 6, 8 } } });
    }

    private int fInput;

    private int fExpected;

    public FibonacciTest(int input, int expected) {
        fInput= input;
        fExpected= expected;
    }

    @Test
    public void test() {
        assertEquals(fExpected, Fibonacci.compute(fInput));
    }
}