我需要为当前的项目学习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
,因此此名称也令人困惑。
为错误消息使用一个常量。这样,在使用异常规则的测试方法中,您可以验证错误文本是否正确,但是在执行此操作时实际上使用常数。不重复文本可减少在应用程序类而非测试类中更改消息的危险。