我需要为当前的项目学习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和创建stubs(?)来控制numberOfTeeth方法中的两个方法调用吗? Animal类内部的Private方法是否会引起任何麻烦?

最佳答案

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


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


因此,您需要以下内容。


要测试的Animal对象,
嘲笑的AnimalType
有效的Tooth对象(可能是模拟的也可能不是模拟的),
JUnit ExpectedException规则-还有其他方法可以测试引发异常的方法,但这是最通用的方法,因此我建议立即学习使用它,并在涉及异常的所有测试中使用它,即使看起来过度杀伤力。


在您的AnimalTest类中,您将拥有三种测试方法,其中一种针对要测试的场景。

numberOfTeethFailsForLiveAnimalWithInvalidTeeth


使用异常规则来“预期” ValidationException
用模拟物numberOfTeeth调用活体动物上的AnimalType。由于尚未对getNumberOfTeeth()进行打桩,因此它将返回null,因此应引发异常。


numberOfTeethSucceedsForLiveAnimalWithValidTeeth


对模拟AnimalType进行存根以从Tooth返回有效的getNumberOfTeeth()
用模拟物numberOfTeeth调用活体动物上的AnimalType


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

numberOfTeethSucceedsForDeadAnimal


调用您需要调用的任何方法,以使动物“不存活”。
用模拟物numberOfTeeth调用活体动物上的AnimalType


同样,无需验证任何内容-该方法完成的事实意味着不会引发异常。

您可以做一些小事情来改进您的代码。


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

10-02 00:26