我是否需要验证与模拟的交互或只检查方法输入和输出?

时间:2014-12-17 23:39:57

标签: unit-testing mocking mockito

是否有必要验证与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)被调用的交互?或者只是检查我得到的输入和输出结果是个好主意吗?

1 个答案:

答案 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)一定次数(包括零)可能有意义,或者在交互是测试行为的关键部分的其他情况下,努力测试正确的输出/状态,而不是验证预期的交互