我正在学习单元测试,我有些困惑,我有一个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。
eat(Food)
更改两个变量(mAmountOfEatenFood
和mIsHungry
)的状态。因此,要知道是否需要再次提供该对象,需要使用mIsHungry
的getter方法。为mAmountOfEatenFood
吸气剂会很好。eat(Food)
的“明显”结果是如果物体仍然饿着。
在测试方法中,您需要具有FoodConsumer的实例。因此,在调用eat(Food)
之后,您可以像isMHungry()
一样调用smth并断言它是true还是false。另外,您可以打电话给getMAmountOfEatenFood()
,以检查进食不足的食物后它是否具有由food.eatFood(....)
估算的适当值。
[为了简化起见,您可以将eat(Food)
更改为布尔值(即使仅用于测试),并在为mIsHungry
设置相同的值后立即返回true / false。
接下来,我们现在看不到的一些魔术发生在:
food.eatFood(mNeededAmountOfFood - mAmountOfEatenFood)
如果这不是任何一种库方法,并且您可以访问它,那么由eatFood
返回的值是否合适,可以进行测试收敛是很好的选择。
我无法确切地说出(由于[C0]中的魔法),但是看起来这种方法发现了某种情况,如果FoodConsumer过量食用该怎么办(我想到的是[C0中的转化率],可能超过eatFood
)。例如,如果eatFood
为1
,neededFood
为100
,则eatenFood
进入90
,该值乘以10
。因此eatFood
与5
递增,导致eatenFood
与50
不相等。简单的解决方法是将140
条件更改为:
amountOfNeededFood
[最后,让我们比较这种情况,例如if
。类似于if(mAmountOfEatenFood >= mNeededAmountOfFood){
的方法是只具有副作用的void方法。调用repository.save(User)
时不会明确显示这些副作用,但是repo.save(User)
必须/应该包含方法,这些方法可以返回一些值来告知save
的内部状态是否已更改。在测试存储库时,要检查repo
方法是否正常工作,测试中的断言是在检查存储库是否返回相同数量的已保存用户,例如,第一个/第二个/第三个用户对象是否包含相同的值repo
时使用的对象的数量。