是否有必要验证与 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 类的模拟对象。我是否需要验证是否调用b.get(id)
的交互?或者只检查我得到的输入和输出结果是个好主意?
通常,验证是否发生了存根调用是不必要的,这会导致测试变得脆弱(即使实现保持正确也会失败的测试(。在您的情况下,是否调用get(id)
或调用多少次可能无关紧要;返回的对象是否正确才重要,并且正确的结果可能需要在某个时候调用b.get(id)
。
Mockito在其verify(T)
Javadoc中有一些明确的建议:
尽管在测试尽管可以验证存根调用,但通常它只是多余的。假设您已经存根了 foo.bar((。如果你的代码关心 foo.bar((返回什么,那么其他东西就会中断(通常在verify((被执行之前(。如果你的代码不关心 get(0( 返回什么,那么它不应该被存根。不服气?看这里。
缓存或延迟加载行为时,或者在交互是测试行为的关键部分的其他情况下,verify(b).get(id)
一定次数(包括零次(可能是有意义的,但请尽量测试正确的输出/状态,而不是验证预期的交互。