谷歌模拟 - 即使函数具有不同的参数

时间:2017-05-30 15:00:44

标签: c++ unit-testing googletest googlemock

我有EXPECT_CALL(MockObj, func("abc")).Times(1)MockObjNiceMock

在我的测试中,除 MockObj.func("def")外,还有一个电话MockObj.func("abc")

我希望合理的做法是让Google Mock说出

  哦,看,我们称之为func("def"),但参数不符合   EXPECT_CALL;这里没什么可看的

但相反它"抱怨":

  

未知文件:失败

     

意外的模拟函数调用 - 采取以下指定的默认操作:

     

C:/work/unit_test.cpp:36:

Function call: func(84bf3d9 pointing to "def")

      Returns: 1
     

谷歌模拟尝试了以下1个期望,但它没有匹配:

     

unit_test.cpp:50:EXPECT_CALL(MockObj,func(" abc"))...

     

预期arg#0:等于84c8b96指向" abc"

     

实际:84bf479指向" def"

     

预期:被召唤一次

     

实际:调用一次 - 饱和且活跃

首先注意到期望仍然满足,因为MockObj.func("abc")被称为

我理解为什么GMock会抛出错误:我在func上宣布了一次预测,所以它试图将对func的调用与预期相匹配但是它与参数不匹配所以错误

精细。

但为什么GMock会抛出错误?由于参数不匹配,为什么选择此行为,即

  如果函数匹配现有的EXPECT_CALL而不是参数

,则抛出错误

1 个答案:

答案 0 :(得分:2)

直接回答你的问题“但为什么GMock会抛出错误?”是:因为它的设计是这样的。

AFAIU googlemock - 您案例中的googlemock以这种方式运作:

  1. EXPECT_CALL(MockObj, func("abc")); - 表示:“我对我的测试中的Obj::func感兴趣”
  2. MockObj NiceMock表示:“我不关心Obj的任何其他未明确的EXPECT_CALL主题的功能”
  3. 所以 - 如果您的测试代码调用func("def") - 那么google-mock会这样做:

    1. 我们对func感兴趣 - 所以让我们检查一下
    2. 我们不期望“def” - 因此未通过测试
    3. 可能你知道你应该这样做:

      EXPECT_CALL(MockObj, func(StrNe("abc"))).Times(AnyNumber()); // meaning - do not care EXPECT_CALL(MockObj, func("abc")); // TImes(1) is default - you might skip it