为空方法创建Junit测试

问题描述 投票:1回答:1

我正在学习单元测试,我有些困惑,我有一个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;
}

}

java android unit-testing mockito junit4
1个回答
1
投票

此方法看起来像它更改了调用它的对象的状态,可以说该对象称为FoodConsumer。

eat(Food)更改两个变量(mAmountOfEatenFoodmIsHungry)的状态。因此,要知道是否需要再次提供该对象,需要使用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返回的值是否合适,可以进行测试收敛是很好的选择。

我无法确切地说出(由于[C​​0]中的魔法),但是看起来这种方法发现了某种情况,如果FoodConsumer过量食用该怎么办(我想到的是[C0中的转化率],可能超过eatFood)。例如,如果eatFood1neededFood100,则eatenFood进入90,该值乘以10。因此eatFood5递增,导致eatenFood50不相等。简单的解决方法是将140条件更改为:

amountOfNeededFood

[最后,让我们比较这种情况,例如if。类似于if(mAmountOfEatenFood >= mNeededAmountOfFood){ 的方法是只具有副作用的void方法。调用repository.save(User)时不会明确显示这些副作用,但是repo.save(User)必须/应该包含方法,这些方法可以返回一些值来告知save的内部状态是否已更改。在测试存储库时,要检查repo方法是否正常工作,测试中的断言是在检查存储库是否返回相同数量的已保存用户,例如,第一个/第二个/第三个用户对象是否包含相同的值repo时使用的对象的数量。

© www.soinside.com 2019 - 2024. All rights reserved.