是否有必要验证与Mock对象的交互?所以我要说我有一个班级:
Class A{
B b;
public A(B b){
this.b = b;
}
int getObjectFromDatabase(int id){
Object o = b.get(id);
// do some extra work
return result
}
}
现在我正在测试getObjectFromDatabase
方法。我已经通过了B类的Mock对象。我是否需要验证b.get(id)
被调用的交互?或者只是检查我得到的输入和输出结果是个好主意吗?
答案 0 :(得分:2)
通常,验证发生存根调用是不必要的,并导致脆弱的测试(即使实现仍然正确,测试也会失败)。在你的情况下,调用get(id)
或多少次可能并不重要;唯一重要的是返回的对象是正确的,并且正确的结果可能需要在某个时刻调用b.get(id)
。
Mockito有一些explicit advice in its verify(T)
Javadoc:
虽然可以验证存根调用,但通常它只是多余的。让我们说你已经删除了foo.bar()。如果你的代码关心foo.bar()返回什么,那么其他东西就会中断(通常甚至在执行verify()之前)。如果您的代码不关心get(0)返回的内容,那么它不应该被存根。不相信?请参阅here。
虽然在测试缓存或延迟加载行为时verify(b).get(id)
一定次数(包括零)可能有意义,或者在交互是测试行为的关键部分的其他情况下,努力测试正确的输出/状态,而不是验证预期的交互。