[英]Create Junit test for Void method
我正在學習單元測試,我有些困惑,我有一個 Void 方法,請您向我解釋如何為這種方法創建單元測試。
public void eat(Food food){
mAmountOfEatenFood += food.eatFood(mNeededAmountOfFood - mAmountOfEatenFood);
if(mAmountOfEatenFood == mNeededAmountOfFood){
System.out.println(mName + " has eaten " + mAmountOfEatenFood + " and will not be hungry for a while..");
mAmountOfEatenFood = 0;
mIsHungry = false;
}else{
System.out.println(mName + " has eaten " + mAmountOfEatenFood + " and is still hungry..");
System.out.println("Needs= " + mNeededAmountOfFood);
mIsHungry = true;
}
}
這個方法看起來像是改變了調用它的對象的狀態,假設該對象被稱為 FoodConsumer。
mAmountOfEatenFood
eat(Food)
改變了兩個變量( mAmountOfEatenFood
和mIsHungry
)的狀態。
因此,要知道是否需要再次提供該對象,需要mIsHungry
的 getter 方法。 為mAmountOfEatenFood
提供吸氣劑會很好。
eat(Food)
的“明顯”結果是對象是否仍然飢餓。
在測試方法中,您需要有一個 FoodConsumer 實例。 因此,稍后在調用eat(Food)
您可以像isMHungry()
一樣調用smth 並斷言它是真還是假。 此外,您可以調用getMAmountOfEatenFood()
來檢查在進食不足的食物后,它是否具有由food.eatFood(....)
估計的正確值。
為了稍微簡化,您可以將eat(Food)
更改為boolean(即使僅用於測試),並在為mIsHungry
設置相同的值后立即返回true/false。
接下來,一些我們現在看不到的魔法發生在:
food.eatFood(mNeededAmountOfFood - mAmountOfEatenFood)
如果這不是任何類型的庫方法並且您可以訪問它,那么如果eatFood
返回的eatFood
是好的,那么最好進行測試轉換。
我不能確切地說(因為eatFood
的魔法),但看起來這種方法發現了一個案例,如果 FoodConsumer 吃多了怎么辦(我在想eatFood
內部的一些轉化率可能超過1
)。
例如,如果neededFood
是100
並且eatenFood
是90
,那么10
去eatFood
將這個數量乘以5
。 因此, eatenFood
增加了50
結果是140
,這與amountOfNeededFood
不相等。
簡單的解決方法是將if
條件更改為:
if(mAmountOfEatenFood >= mNeededAmountOfFood){
最后,讓我們比較一下這個案例,比如repository.save(User)
。
類似於repo.save(User)
是一個只有副作用的 void 方法。
調用save
時沒有明確顯示這些副作用,但是repo
必須/應該包含一些方法,這些方法可以返回一些值,告訴repo
的內部狀態是否已更改。
在測試存儲庫時,為了檢查save
方法是否正常工作,測試中的斷言檢查存儲庫返回的用戶數是否與保存的用戶數相同,例如,第一個/第二個/第三個用戶對象是否包含相同的值save
時使用的對象。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.