JUNIT测试 - 为什么构造函数被调用两次

时间:2016-01-30 10:19:39

标签: java junit

正如我的班级名字所示:如果我的班级是Iterator的一个实例,我想测试一下。因此,我想知道,如果它只需要实现接口这样做,似乎就足够了。

但是,当我通过JUNIT Test运行以下类时,我得到了以下控制台输出:

Do something!

Do something!

I did something!

似乎类构造函数被调用了两次!但是我不知道第二个电话来自哪里。我已经测试了“if”参数的变体来排除,instanceof有错,比如

// if (a instanceof Object) {
// if (a instanceof Iterator) {
// if (2 > 3) {

然而,在所有3个案例中都被调用了。因此,我假设单元测试首先尝试,需要为自己创建一个类的对象来执行所有测试,因为它们是类的一部分。这是正确的(?)

import java.util.Iterator;

import org.junit.Test;

public class InstanceOfIteratorTest implements Iterator {

    @Test
    public void test1() {
        InstanceOfIteratorTest a = new InstanceOfIteratorTest();
        if (a instanceof Iterator) {
            System.out.println("I did something!");
        } else {
            System.out.println("I did nothing!");
        }
    }

    public InstanceOfIteratorTest() {
        System.out.println("Do something!");
    }

    @Override
    public boolean hasNext() {
            throw new java.lang.UnsupportedOperationException("blub");
    }

    @Override
    public Integer next() {
            throw new java.lang.UnsupportedOperationException("blub");
    }

    @Override
    public void remove() {
            throw new java.lang.UnsupportedOperationException("blub");
    }
}

2 个答案:

答案 0 :(得分:2)

test1()是类InstanceOfIteratorTest的实例方法,所以是的,JUnit需要先创建实例,然后调用该方法。这就是实例的运作方式。

答案 1 :(得分:1)

在Java中,如果没有create Object并调用construstor,则无法调用非静态方法。当然,Junit必须调用construstor,所以真正的代码:

在Junit:

  ...
  InstanceOfIteratorTest l = new InstanceOfIteratorTest(); // print "Do something!"
  l.test1();

在l.test1:

    InstanceOfIteratorTest a = new InstanceOfIteratorTest(); // print "Do something!"
    if (a instanceof Iterator) {
        System.out.println("I did something!"); // print "I did something!"
    } else {
        System.out.println("I did nothing!");
    }

您可以将代码更改为:

@Test
public void test1() {
    if (this instanceof Iterator) {
        System.out.println("I did something!");
    } else {
        System.out.println("I did nothing!");
    }
}

在这种情况下“做点什么!”只打印一次。