我需要为我目前的项目学习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方法是否会抛出任何东西?
答案 0 :(得分:2)
为了完全彻底地测试这种方法,我说你想要以下三种情况的测试用例。
所以你需要以下内容。
Animal
对象,AnimalType
,Tooth
对象,可能是也可能不是模拟,ExpectedException
规则 - 还有其他测试方法可以抛出异常,但这是最通用的,所以我建议学习现在使用它,并在所有涉及异常的测试中使用它,即使它看起来有点矫枉过正。在AnimalTest
课程中,您将拥有三种测试方法,每种测试方法适用于您要测试的每种方案。
<强> numberOfTeethFailsForLiveAnimalWithInvalidTeeth 强>
ValidationException
。numberOfTeeth
在活动物上调用AnimalType
。由于您没有存根getNumberOfTeeth()
,它将返回null,因此应该抛出异常。<强> numberOfTeethSucceedsForLiveAnimalWithValidTeeth 强>
AnimalType
存根,以便从Tooth
返回有效的getNumberOfTeeth()
。numberOfTeeth
AnimalType
醇>
无需验证任何内容 - 此方法完成的事实意味着不会抛出异常。
<强> numberOfTeethSucceedsForDeadAnimal 强>
numberOfTeeth
AnimalType
醇>
同样,没有必要验证任何东西 - 这个方法完成的事实意味着不抛出异常。
您可以采取一些小方法来改进代码。
AnimalType
的类型时,请勿调用animal
参数Animal
- 这太令人困惑。getNumberOfTeeth()
方法使用其他名称 - 它不会返回数字,但会返回Tooth
,因此此名称也会令人困惑。