JUnit - 使用参数中的对象测试类实例化

时间:2016-08-31 07:12:51

标签: java class unit-testing junit

我是JUnit测试的新手,我正在尝试了解如何测试类的实例化。

我们假设我有以下ToyBox类需要ArrayList<Toy>才能实例化。当然,这个玩具列表是在程序的另一部分创建的,但是我不太清楚我应该在哪里创建它以进行单元测试ToyBox

ToyBox类

public ToyBox(ArrayList<Toy> toyList){
    this.toys= toyList;

    for (Toy toy: toyList) {
        checkToy(toy);
    }
}

private void checkToy(Toy toy){
    if (toy.isRed()){
        this.numRed += 1;
    } else {
        this.numBlue += 1;
    }
}
public int getBlues(){
    return this.numBlue;
}

ToyBoxTest

public class ToyBoxTest {

    @Test
    public void getNumBlues() throws Exception {
        // assert that num blues corresponds
    }

我应该在哪里实例化ToyBox类以执行getNumBlues()方法?

它应该是这样吗?

public class ToyBoxTest {
    ArrayList<Toy> toyList = new ArrayList<Toy>();
    Toy toy1 = new Toy("blue", "car");
    Toy toy2 = new Toy("red", "bike");
    toyList.add(toy1);
    toyList.add(toy2);

    @Test
    public void getNumBlues() throws Exception {
        // assert that num blues corresponds
        ToyBox box = new ToyBox(toyList);
        assertEquals(1, box.getBlues());
    }

基本上,我的问题是我应该在哪里以及如何创建测试依赖于创建列表的类所需的对象的arraylist。

1 个答案:

答案 0 :(得分:2)

大多数教程都会说最佳实践是在设置方法中实例化您要测试的对象(JUnit术语中的@Before方法)。但是,您的用例不适合这种模式。当您的构造函数包含所有逻辑时,您应该在测试中实例化对象,然后断言getNumBlues()getNumReds()返回正确的结果。 E.g:

@Test
public void bothColors() throws Exception {
    ArrayList<Toy> toyList = new ArrayList<>(Arrays.asList
        new Toy("blue", "car"),
        new Toy("red", "bike"));
    ToyBox box = new ToyBox(toyList);
    assertEquals(1, box.getBlues());
}

@Test
public void justBlues() throws Exception {
    ArrayList<Toy> toyList = new ArrayList<>(Arrays.asList
        new Toy("blue", "car"),
        new Toy("blue", "bike"));
    ToyBox box = new ToyBox(toyList);
    assertEquals(2, box.getBlues());
}

// etc...