我有一个内部使用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);
}
..
}
答案 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));
}
}