2013-07-17 52 views
1

我有以下類。驗證私有構造函數未使用JMockit調用/調用

public Task { 

    public static Task getInstance(String taskName) { 
     return new Task(taskName); 
    } 

    private Task(String taskName) { 
     this.taskName = taskName; 
    } 
} 

我正在使用JMockit測試Task.getInstance()。在我測試時,我需要確認對private Task()的調用是否實際完成。我之前使用過Verifications塊來驗證測試夾具對象上的方法執行,但在這裏我沒有。

+2

所以基本上你試圖測試,看看編譯器是否工作? –

回答

3

這是可以做到,雖然它很可能不應是任何正常筆試:

@Test 
public void badTestWhichVerifiesPrivateConstructorIsCalled() 
{ 
    new Expectations(Task.class) {{ // partially mocks `Task` 
     // Records an expectation on a private constructor: 
     newInstance(Task.class, "name"); 
    }}; 

    Task task = Task.getInstance("name"); 

    assertNotNull(task); 
} 

@Test 
public void goodTestWhichVerifiesTheNameOfANewTask() 
{ 
    String taskName = "name"; 

    Task task = Task.getInstance(taskName); 

    assertNotNull(task); 
    assertEquals(taskName, task.getName()); 
} 

@Test 
public void goodTestWhichVerifiesANewTaskIsCreatedEverytime() 
{ 
    Task task1 = Task.getInstance("name1"); 
    Task task2 = Task.getInstance("name2"); 

    assertNotNull(task1); 
    assertNotNull(task2); 
    assertNotSame(task1, task2); 
} 

同樣,兩種局部嘲弄和私有方法的嘲諷/構造應避免在一般。

+0

謝謝。只是一個簡單的問題。驗證用於驗證方法調用。他們不應該在單元測試中驗證嗎?我的意思是,如果你的測試方法調用其他方法,驗證它們是否被實際調用,那麼這不是一個好習慣嗎? – divinedragon

+2

僅當您正在驗證的方法屬於* unit *單元時纔是單元測試的單元。在單元測試中模擬的目的是讓一個單元獨立地從其它依賴的單元進行測試*。而且,一般來說,每個單位都是一個具有明確目的的班級/類型。 –

+0

如果getInstance()不返回任何東西,假設你需要測試的方法需要驗證它,它叫做構造函數? – supertonsky

0

我不認爲你應該正常地測試私有方法的調用。

重要的是您的輸入提供正確的輸出。我通常會期望測試是黑匣子。即您可以更改實現,但組件在給定相同輸入的情況下仍然可以提供正確的輸出。

如果測試這樣的事情私有方法,然後你的測試將是重構非常敏感,以及其作爲迴歸測試功能將受到限制,因爲你必須要重構測試與你的主代碼重構一起。

+0

我同意這一點。但出於好奇,是否有可能?我相信它應該是,但只是不知道方式。 – divinedragon