Mockito-需要帮助从示例中学习

时间:2014-05-09 21:25:46

标签: java spring-mvc mocking mockito

我需要为我目前的项目学习Mockito并且正在努力奋斗。我可能会补充一点,我也从来没有在单元测试中教过任何东西(在java中对于那个母校很少,哈哈)所以我似乎必须一次学习多个东西。我花了一些时间在Mockito上查看了一些资源,但仍然可以使用一些帮助。下面我创建了一个小例子,我希望有人可以在Mockito为我创建JUNIT时为我回答。

public class Animal{

    public numberOfTeeth(AnimalType animal){
          if animalAlive(){
               Teeth tooth= animal.getNumberOfTeeth();
                if(tooth== null) {     
                    throw new ValidationException("Invalid Tooth");        
                 }
          }
    }

请原谅语法错误,这是一个快速编写的学习示例。

因此,假设animalAlive()是Animal类中的私有方法,getNumberOfTeeth()是其他类中的公共方法。我假设一个junit测试可能会测试是否应该抛出异常?最好的方法是什么?

我认为它涉及模拟AnimalType并创建存根(?)来控制numberOfTeeth方法中的两个方法调用? Animal类中的Private方法是否会抛出任何东西?

1 个答案:

答案 0 :(得分:2)

为了完全彻底地测试这种方法,我说你想要以下三种情况的测试用例。

  • 当动物活着并且牙齿数量为空时抛出异常,
  • 动物活着且牙齿数量不为空时也不例外,
  • 动物死了也不例外。

所以你需要以下内容。

  • 要测试的Animal对象,
  • 嘲笑AnimalType
  • 有效的Tooth对象,可能是也可能不是模拟,
  • 一个JUnit ExpectedException规则 - 还有其他测试方法可以抛出异常,但这是最通用的,所以我建议学习现在使用它,并在所有涉及异常的测试中使用它,即使它看起来有点矫枉过正。

AnimalTest课程中,您将拥有三种测试方法,每种测试方法适用于您要测试的每种方案。

<强> numberOfTeethFailsForLiveAnimalWithInvalidTeeth

  1. 使用例外规则&#34;期待&#34; ValidationException
  2. 使用模拟numberOfTeeth在活动物上调用AnimalType。由于您没有存根getNumberOfTeeth(),它将返回null,因此应该抛出异常。
  3. <强> numberOfTeethSucceedsForLiveAnimalWithValidTeeth

    1. 将您的模拟AnimalType存根,以便从Tooth返回有效的getNumberOfTeeth()
    2. 使用模拟numberOfTeeth
    3. ,对活动动物打AnimalType

      无需验证任何内容 - 此方法完成的事实意味着不会抛出异常。

      <强> numberOfTeethSucceedsForDeadAnimal

      1. 打电话给你需要打电话的任何方法,让你的动物“不活着”#。
      2. 使用模拟numberOfTeeth
      3. ,对活动动物打AnimalType

        同样,没有必要验证任何东西 - 这个方法完成的事实意味着不抛出异常。

        您可以采取一些小方法来改进代码。

        • 当您有一个名为AnimalType的类型时,请勿调用animal参数Animal - 这太令人困惑。
        • getNumberOfTeeth()方法使用其他名称 - 它不会返回数字,但会返回Tooth,因此此名称也会令人困惑。
        • 使用常量作为错误消息。这样,在使用异常规则的测试方法中,您可以验证错误的文本是否正确,但实际上在执行此操作时实际使用常量。不重复文本可以降低在应用程序类中更改消息的危险,但不会降低测试类中的消息。