[英]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.