2016-01-30 134 views
2

正如我的类名所示:我想测试一下,如果我的类是Iterator的一个实例。因此,我想知道,如果它只需要实现接口来做,看起来就足够了。JUNIT测试 - 为什么构造函数被调用两次

然而,当我通过JUnit测试运行下面的类我得到了以下控制台输出:

Do something! 

Do something! 

I did something! 

看来类的构造函数被调用两次!不过,我不知道第二个电话来自哪里。我已经测试了“如果”的说法的变化,以排除,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

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

+0

啊谢谢你,这证实了我的猜测。 – blauerschluessel

+1

我可以在8分钟内接受答案,并将在8分钟内完成答复(如果这对你很好) – blauerschluessel

1

在Java中,如果不创建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!"); 
    } 
} 

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

相关问题