使用Mockito进行测试,我可以轻松地对这种方法进行单元测试:
public void doTheDog() {
// Some code
extObj.executeDog();
}
我将简单地验证executeLog()是否已被调用:
verify(extObj).executeDog();
然而,当我有一个非常长和复杂的方法时,这并不总是那么容易。
public void doTheDog() {
// Very long code
extObj.bark();
// Very long code
extObj.walk();
}
即使我去掉了bark(),上面的方法仍然会表现得像狗一样。所以测试它没有多大意义:
verify(extObj).bark();
嘲笑之后,如果代码运行良好,就没有什么东西能真正告诉我了!!!
故事结束了。现在,我必须为最像上面长而复杂的代码的代码编写单元测试。无论如何,我能做些什么来用mocking编写好的单元测试呢?
正如mpkorstanje在评论中开始的那样,一个好的单元测试应该验证给定单元的行为是否尽可能紧密、简洁地符合规范。
这里的部分问题似乎是您的规范没有明确定义:dog.bark()
足够重要,可以发生,但还不够重要,无法指定或测试。如果你觉得这个方法又长又复杂,最好的解决方案是将这个方法重构成小的、清晰的、可测试的部分,然后单独测试它们。这也可能使它们更容易在实际生产系统中使用。
尽管如此,与基于回放的模拟系统相比,Mockito是为灵活的测试而设计的:是否使用verify(dog).bark()
完全由您选择,或者您可以选择atLeastOnce()
或订单(请参阅InOrder)的确切数量是否重要。一般来说,尽量少地指定,这样您的测试就可以通过实际系统中的任何工作实现或更改。