在EXPECT_CALL和Gmock之前使用ON_CALL时的奇怪行为

Odd Behavior When Using ON_CALL before EXPECT_CALL with Gmock

本文关键字:CALL ON EXPECT Gmock      更新时间:2023-10-16

当ON_CALL语句后面跟着EXPECT_CALL语句时,有人见过gmock中的奇怪行为吗?对我来说,以下代码中的EXPECT_CALL语句不起作用(它实际上并没有强制执行Times部分(:

ON_CALL(myMockObject, myMockMethod()).WillByDefault(Return("hello mock")));
EXPECT_CALL(myMockObject, myMockMethod()).Times(99999);
myMockObject.myMockMethod();

我尝试过的其他解决方案:

从超级类重写myMockMethod,并让它简单地返回一个字符串文本。这个问题是我无法确定它后来被调用了多少次

跳过ON_CALL部分,选择以下内容:

EXPECT_CALL(myMockObject, myMockMethod())
    .Times(1)
    .WillRepeatedly(Return("hello mock"));

这会导致编译错误。

同样值得注意的是,我在这个例子中使用的字符串文字在现实中是自定义的,gmock无法为其提供默认值(如bool(。

您的原始代码中有一些其他错误,问题中没有提到。如果您构造了一个最小的自包含示例,那么问题中提供的代码的行为与您预期的一样。

例如,以下代码:

#include <string>
#include "gmock/gmock.h"
using ::testing::Return;
struct MyClass {
  virtual ~MyClass() {}
  virtual std::string myMockMethod() = 0;
};
struct MyMockClass : MyClass {
  MOCK_METHOD0(myMockMethod, std::string());
};
TEST(MyClass, Fails) {
  MyMockClass myMockObject;
  ON_CALL(myMockObject, myMockMethod()).WillByDefault(Return("hello mock"));
  EXPECT_CALL(myMockObject, myMockMethod()).Times(99999);
  myMockObject.myMockMethod();
}
TEST(MyClass, Passes) {
  MyMockClass myMockObject;
  EXPECT_CALL(myMockObject, myMockMethod()).Times(1).WillRepeatedly(Return("hello mock"));
  myMockObject.myMockMethod();
}
int main(int argc, char **argv) {
  testing::InitGoogleTest(&argc, argv);
  return RUN_ALL_TESTS();
}

产生以下(预期(输出:

[==========] Running 2 tests from 1 test case.
[----------] Global test environment set-up.
[==========] 2 tests from MyClass
[ RUN      ] MyClass.Fails
..srcmain.cc(18): error: Actual function call count doesn't match EXPECT_CALL(myMockObject, myMockMethod())...
         Expected: to be called 99999 times
           Actual: called once - unsatisfied and active
[  FAILED  ] MyClass.Fails (0 ms)
[ RUN      ] MyClass.Passes
[       OK ] MyClass.Passes (0 ms)
[----------] 2 tests from MyClass (2 ms total)
[----------] Global test environment tear-down
[==========] 2 tests from 1 test case ran. (2 ms total)
[  PASSED  ] 1 test.
[  FAILED  ] 1 test, listed below:
[  FAILED  ] MyClass.Fails
 1 FAILED TEST

如果你想把你的模拟对象放在测试夹具中,你可以这样做:

class MyClassTest : public testing::Test {
 protected:
  MyMockClass myMockObject_;
};
TEST_F(MyClassTest, Fails) {
  ON_CALL(myMockObject_, myMockMethod()).WillByDefault(Return("hello mock"));
  EXPECT_CALL(myMockObject_, myMockMethod()).Times(99999);
  myMockObject_.myMockMethod();
}
 Mock::VerifyAndClearExpectations(&myMockObject);

这就成功了。我仍然不确定在幕后是如何管理期望的,但这让我开始工作。

不过,如有任何进一步的解释,我们将不胜感激。