簡體   English   中英

為 Void 方法創建 Junit 測試

[英]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)改變了兩個變量( mAmountOfEatenFoodmIsHungry )的狀態。
因此,要知道是否需要再次提供該對象,需要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 )。
例如,如果neededFood100並且eatenFood90 ,那么10eatFood將這個數量乘以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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM