2016-03-04 20 views
2

想我下面的類:我應該在單元測試中檢查協作者的回報值嗎?

class A { 
private B b; 
private int milkQuantity; 

A(B b) { 
    this.b = b; 
} 

public getCoffee() { 
    milkQuantity = b.getMilk(1); 

    return secretRecipe();  
} 

... 
} 

所以,雖然單元測試應該嘲笑我類B,檢查是否getMilk()方法被調用或者我應該檢查它是否返回正確的奶量(即1杯)?對於後一種情況,我需要在我的單元測試中設置類B

根據我們的說法,我們需要檢查類B在自己的單元測試中的行爲,只有在調用了正確的方法時才應該關注類A

更新1

使我的觀點更明確:

上調用a.getCoffee()我應該測試:

assertThat(a.milkQuantity).isEqualTo(1); 

OR

verify(b).getMilk(); 
+1

東西,如果你正在測試'A',你只需要檢查'A'是做什麼它應該。如果你正在測試'B',你需要檢查'B'正在做它應該做的事情。 – khelwood

回答

2

在編寫單元測試時,您需要在自己的測試中處理每個單元(通常是一個類)。 SO B需要自己的測試,並且A需要使用B的模擬實例進行測試以測試其正確使用它。你並不需要檢查getMilk的返回值(畢竟 - 你嘲笑的話),但你需要檢查B正確地使用它 - 即是secretRecipe被稱爲具有相同的值getMilk返回。

1

理想情況下,您需要測試getCoffee的行爲,而不是如何實施。也許在將來你會以不同的方式實現它,但具有相同的行爲,並且不應該打破你的單元測試。所以我建議只測試getCoffee的結果。模擬b.getMilk很好。

測試時我會建議做這樣

B b = new B() { 
    @Override 
    public int getMilk(int x){ 
     // Mock implementation 
    } 
} 

A a = new A(b); 
Coffee expected = ... // Manually construct a Coffee object with expected values 
assertEquals(expected, a.getCoffee()) 
相關問題