這不僅僅是一個實際案例,在試圖獲得單元測試和集成測試之間的細節差異時,這是一個問題。這是集成測試還是單元測試?
可以說我有一流的總和,它增加了兩個整數:
class Sum{
int x;
int y;
public int add(){
return x + y;
}
...getters and setters...
}
而且我還有一個類,負責驗證結果,以確認值的預期。只是爲了舉例來說,假設我們要添加唯一的正數:
class ValidateSum{
Sum sum;
public boolean validate(){
if(sum.getX()>=0 and sum.getY()>=0){
return true;
}
else{
return false;
}
}
... getters and setters...
}
也許它沒有很多的意義有ValidateSum,還是讓我們只是假設它爲例子的緣故。
現在我想爲ValidateSum編寫測試。如果我這樣做:
@Test
public void testValidateSum(){
ValidateSum vs = new ValidateSum();
Sum sum = new Sum();
vs.setSum(sum);
boolean result = vs.validate();
assertTrue(result);
}
是單元測試還是集成測試?
我知道單元測試只需要驗證ValidateSum中的功能,並且以測試的方式進行:它只從Sum獲取屬性,而不是它的任何功能。
但是另一方面,即使ValidateSum只調用getter,也可以說您正在從Sum訪問功能。 Sum的getter中的任何更改都會影響ValidateSum的測試,從而打破了單元測試的概念。
但是如果是這種情況,並且確實是一個集成測試,那麼我該如何爲ValudateMethod的validate()寫一個單元測試?
我無法想到的唯一事情就是嘲笑Sum,所以它會返回相同的值。即使Sum的getter中的邏輯發生了變化,ValidateSum的測試也會保持不變。問題在於嘲笑getter的響應可能會增加不必要的複雜性,因爲getter中的邏輯更改的可能性非常低,而我們所做的只是獲得一個屬性。
我希望我的問題有意義,這更多的是理論上的疑問。
編輯
謝謝您的解答。他們有重要的事情要記住。我選爲最佳答案之一,就是因爲它使我這個:
http://www.mockobjects.com/2007/04/test-smell-everything-is-mocked.html
而其真正的:理論上我會嘲笑總和,使其成爲一個純粹的單元測試。但是對於大多數情況,添加複雜性的成本以及花費在模擬屬性getter上的努力並不值得僅僅是爲了獲得「最純粹的」單元測試,實踐中,對於這種情況,Unit和Integration測試之間的差異是主觀的。
這是一個單元測試,但ValidateSum與Sum緊密結合。如果一個變化(如Sum),那麼你也必須改變'ValidateSum'。事實上,'ValidateSum'應該可能是你的jUnit類中的一個函數。 –