2016-01-30 160 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!"); 
    } 
} 

在這種情況下「做點什麼!」僅打印一次。

相關問題