我需要为我目前的项目学习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()是其他类中的公共方法。我假设一个可能会做的单元测试是测试异常是否在应该抛出的时候被抛出?最好的方法是什么?
我认为它涉及模拟AnimalType和创建存根(?)来控制numberOfTeeth方法内部的两个方法调用?动物类内部的私有方法会在任何事情上造成麻烦吗?
要完全彻底地测试这个方法,我想说您需要以下三种场景的测试用例。
- 当动物活着且牙齿数量为空时抛出异常,
- 动物活着且牙齿数量不为空时不例外,
- 动物死亡时不例外。
所以你需要以下内容:
- 要测试的
Animal
对象, - 模拟
AnimalType
, - 一个有效的
Tooth
对象,可以是也可以不是mock, - 一个JUnit
ExpectedException
规则——还有其他方法可以测试抛出的异常,但这是最通用的,所以我建议现在就学习使用它,并在所有涉及异常的测试中使用它,即使它看起来有些多余。
在AnimalTest
课程中,您将有三个测试方法,一个用于您要测试的每种场景。
numberOfTeethFailsForLiveAnimalWithInvalidTeeth
- 使用例外规则"期望"
ValidationException
。 - 在活体动物上调用
numberOfTeeth
,使用模拟AnimalType
。由于您没有存根getNumberOfTeeth()
,它将返回null,因此应该抛出异常。
numberOfTeethSucceedsForLiveAnimalWithValidTeeth
- 存根你的模拟
AnimalType
从getNumberOfTeeth()
返回一个有效的Tooth
。 - 使用模拟的
AnimalType
在活体动物上调用numberOfTeeth
。
不需要验证任何东西——这个方法完成的事实意味着没有抛出异常。
numberOfTeethSucceedsForDeadAnimal
- 调用任何你需要调用的方法,使你的动物"不活"。
- 使用模拟的
AnimalType
在活体动物上调用numberOfTeeth
。
同样,不需要验证任何东西——这个方法完成的事实意味着没有抛出异常。
你可以做一些小事情来改进你的代码。
- 当你有一个叫做
Animal
的类型时,不要把你的AnimalType
参数叫做animal
——这太混乱了。 - 为
getNumberOfTeeth()
方法使用不同的名称-它不返回数字,它返回Tooth
,所以这个名称也令人困惑。 - 在错误信息中使用常量。这样,在使用异常规则的测试方法中,您可以验证错误的文本是否正确,但在执行此操作时实际上使用常量。不复制文本可以减少在应用程序类中更改消息而在测试类中更改消息的危险。