JUnit:具有私有字段的测试构建器

时间:2015-03-20 21:11:21

标签: java arrays unit-testing junit constructor

我是初学者,我在类的构造函数中遇到了JUnit测试的问题。

我要测试的类名为IntSortedArray,如下所示:

public class IntSortedArray {

    private int[] elements; 
    private int size; 


    public IntSortedArray() {
        this.elements = new int[16];
        this.size = 0;
    }

    public IntSortedArray(int initialCapacity) throws IllegalArgumentException {
        if(initialCapacity < 0) {
            throw new IllegalArgumentException("Error - You can't create an array of negative length.");
        }
        else {
            elements = new int[initialCapacity];
            size = 0;
        }
    }

    public IntSortedArray(int[] a) {
        elements = new int[a.length + 16];
        for(int i = 0; i < a.length; i++)
            elements[i] = a[i];
        size = a.length;
        insertionSort(elements);
    }

    //other code...

}

使用Eclipse,我为JUnit创建了一个类:

public class IntSortedArrayUnitTest {

    private IntSortedArray isa;

    @Test
    public void testConstructorArray16Elements() {
        isa = new IntSortedArray();
        int expected = 0;
        for(int i: isa.elements) **<-- ERROR**
         expected += 1;
        assertEquals(expected, 16);
    }

}

我开始编写一个测试类,目的是测试类IntSortedArray的所有方法,包括构造函数。

第一种方法testConstructorArray16Elements()想要测试第一个构建器。 所以我想我会检查数组元素的创建是否正确完成,因此for循环计算elements的长度并确保它沿16(根据需要)。

但Eclipse生成(正确)错误,因为elementsprivate。 我该如何解决这个错误?我不想放置public字段,如果可能,我希望避免创建方法public int[] getElements()

你推荐什么?

另一个问题:我可以做两个断言相同的方法吗?一个用于测试数组的长度,另一个用于测试size是否为0。

我希望不要犯大错,这是我第一次使用JUnit。

PS:我如何测试第二个构造函数?

非常感谢!

2 个答案:

答案 0 :(得分:0)

看起来您的类字段被声明为私有,但您尝试从类外部访问。您需要在课程中提供访问者方法,以使其可见:

private int[] elements;
private int size; 
public static final int MAX = 16;

public int[] getElements() { ... }
public int getSize() { return size; }

然后你就可以写下面的代码了:

isa = new IntSortedArray();
int expected = 0;
for(int i: isa.getElements()) {
  expected += 1;
}
assertEquals(expected, IntSortedArray.MAX );

看起来你的构造函数已经为16个整数创建了一个数组,但是没有用任何值初始化它。要做到这一点,你应该有以下代码:

public IntSortedArray() {
    this.elements = new int[MAX];
    this.size = 0;
    for (int i=0 ; i < MAX ;i++) {
       elements[i] = i;
       size++;
    }
}

答案 1 :(得分:-1)

您必须为您的阵列编写一个getter方法,或者实现一个Iterator