使用Mockito对冗长而复杂的方法进行单元测试

时间:2016-01-11 15:27:36

标签: java unit-testing mockito powermock

使用Mockito进行测试,我可以轻松地对此方法进行单元测试:

public void doTheDog() {

    // Some code

    extObj.executeDog();
}

我将简单地验证是否已调用executeDog():

verify(extObj).executeDog();

然而,当我有一个非常漫长而复杂的方法时,这并不总是那么容易。

public void doTheDog() {

    // Very long code

    extObj.bark();

    // Very long code

    extObj.walk();
}

即使我删除了bark(),上面的方法仍然会像狗一样。因此测试它没有多大意义:

verify(extObj).bark();

在模拟之后,没有什么能真正告诉我代码是否正常工作!!!

故事结束。现在我必须为代码编写单元测试,这些代码最像上面的长而复杂的代码。无论如何,我可以用嘲弄来编写好的单元测试吗?

1 个答案:

答案 0 :(得分:1)

正如mpkorstanje在评论中所说,一个好的单元测试应该验证给定单元的行为尽可能紧密和简洁地匹配规范。

这听起来像问题的一部分是您的规范没有明确定义:dog.bark()非常重要,但不够重要,无法指定或测试。如果您认为该方法很长且复杂,那么最好的解决方案是将该方法重构为小而清晰,可测试的部分,然后单独测试它们。这也可能使它们更容易在您的实际生产系统中使用。

所有这一切,与基于重放的模拟系统相比,Mockito专为灵活测试而设计:完全是您选择是verify(dog).bark()还是您可以选择是否确切数量atLeastOnce()或订购(参见InOrder)事宜。一般来说,射击指定尽可能少,以便您的测试将通过任何工作实现或更改您的实际系统。