【问题标题】:Create Junit test for Void method为 Void 方法创建 Junit 测试
【发布时间】:2020-01-28 02:45:35
【问题描述】:

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

}

【问题讨论】:

  • 我认为该主题已被以下帖子所涵盖:https://stackoverflow.com/questions/16043819/junit-testing-void-methods
  • 你想在 void 方法中测试什么?
  • @Deadpool 实际上我有一个新项目,我需要在其中创建一个单元测试,我开始研究它并完成了一些 Util 类,但是当我来到一个 Void 方法时,有一些逻辑,那时我不知道如何为此创建测试,实际上我需要测试什么。希望你明白我的意思。
  • 对于 void 方法,您只需使用Assert.assertEquals()
  • @VishwaRatna 那么我如何在该方法中覆盖 5-6 行逻辑?

标签: java android unit-testing mockito junit4


【解决方案1】:

这个方法看起来改变了调用它的对象的状态,假设这个对象被称为 FoodConsumer。

eat(Food) 更改两个变量(mAmountOfEatenFoodmIsHungry)的状态。
因此,要知道您是否需要再次输入该对象,需要 mIsHungry 的 getter 方法。最好有 mAmountOfEatenFood 的吸气剂。
eat(Food) 的“明显”结果是对象是否仍然处于饥饿状态。

在测试方法中,你需要有一个 FoodConsumer 的实例。因此,稍后在调用eat(Food) 之后,您可以像isMHungry() 一样调用smth 并断言它是真还是假。此外,您可以致电getMAmountOfEatenFood() 来检查在吃完食物后它是否具有food.eatFood(....) 估计的适当价值。

为了简单起见,您可以将eat(Food) 更改为布尔值(即使仅用于测试),并在为mIsHungry 设置相同的值后返回真/假。

接下来,一些我们现在看不到的魔法发生在:

food.eatFood(mNeededAmountOfFood - mAmountOfEatenFood)

如果这不是任何类型的库方法并且您可以访问它,那么如果eatFood 返回的值是好的,那么最好进行测试转换。

我不能确切地说(因为eatFood 中的魔法),但看起来这种方法发现了一个案例,如果 FoodConsumer 吃得太多怎么办(我在想@ 987654336@ 可能超过1)。
例如,如果neededFood100 并且eatenFood90,那么10 将变为eatFood,它将该数量乘以5。所以eatenFood 增加50 导致140 不等于amountOfNeededFood
简单的解决方法是将您的 if 条件更改为:

if(mAmountOfEatenFood >= mNeededAmountOfFood){

最后,让我们比较一下这个案例,比如repository.save(User)
类似于 repo.save(User) 的东西是一种只有副作用的 void 方法。
这些副作用在调用save 时没有明确显示,但是repo 必须/应该包含一些方法,这些方法可以返回一些值,告诉repo 的内部状态是否已更改。
在测试存储库时,为了检查 save 方法是否正常工作,测试中的断言正在检查存储库是否返回相同数量的已保存用户,例如,如果第一个/第二个/第三个用户对象包含相同的值save时使用的对象。

【讨论】:

  • 感谢您的解释,很有帮助
猜你喜欢
  • 1970-01-01
  • 2013-08-01
  • 2014-01-05
  • 1970-01-01
  • 2023-02-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多