繁体   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