c – GMock:如何返回mock类变量作为返回值

我试图第一次使用GMock(谷歌的模拟框架).我有以下课程:

class LocalCache
{
public:
  virtual time_t GetCurrentTime() = 0;
  virtual int AddEntry(const std::string key, std::string& value);
  virtual int GetEntry(const std::string key, std::string& value);
};

GetEntry方法调用GetCurrentTime调用.我想模拟GetCurrentTime方法,以便我可以在测试中推进时钟以测试作为GetEntry调用的一部分发生的条目的老化(请不要问我为什么老化是作为一部分完成的GetEntry调用……这是另一个讨论:().这是我的模拟类:

class MockLocalCache : public LocalCache
{
public:
  using LocalCache::GetCurrentTime;
  MOCK_METHOD0(GetCurrentTime, time_t());

  MockLocalCache()
  : mCurrentTime(0)
  {
  }

  void EnableFakeTime()
  {
    ON_CALL(*this, GetCurrentTime()).WillByDefault(Return(mCurrentTime));
  }

  void SetTime(time_t now) { mCurrentTime = now; }

private:
  time_t  mCurrentTime;
};

TEST(MockTest, TimeTest)
{
  MockLocalCache mockCache;

  mockCache.EnableFakeTime();

  std::string key("mykey");
  std::string value("My Value");

  EXPECT_TRUE(mockCache.AddEntry(key, value));

  mockCache.SetTime(10);   // advance 10 seconds

  std::string expected;
  EXPECT_TRUE(mockCache.GetEntry(key, expected));
}

当我运行测试时,我希望通过我的模拟GetCurrentTime函数返回’mCurrentTime’值.但是,我得到以下错误输出:

GMOCK WARNING:
Uninteresting mock function call - taking default action specified at:
..../test_local_cache.cpp:62:
    Function call: GetCurrentTime()
          Returns: 0
Stack trace:

如果有人能让我知道我做错了什么以及如何解决它,我将不胜感激.提前致谢.

最佳答案 解决问题的方法是以更简单的方式实现.只需使用您希望调用mocked函数的EXPECT_CALL:

class MockLocalCache : public LocalCache
{
public:
  MOCK_METHOD0(GetCurrentTime, time_t());
};

TEST(MockTest, TimeTest)
{
  MockLocalCache mockCache;

  std::string key("mykey");
  std::string value("My Value");

  EXPECT_TRUE(mockCache.AddEntry(key, value));

  EXPECT_CALL(mockCache, GetCurrentTime()).WillOnce(Return(10));   // advance 10 seconds

  std::string expected;
  EXPECT_TRUE(mockCache.GetEntry(key, expected));
}

只是为了回答为什么你的例子不起作用 – 通过这个调用,你的成员变量的当前值被存储 – 以后更改它没有任何效果:

ON_CALL(*this, GetCurrentTime()).WillByDefault(Return(mCurrentTime));

google-mock-doc中查看退货和退货之间的差异(ByRef …

可能 – 我没有检查这个,调用set成员值,在调用设置之前这个默认值也可以 – 但正如我所说的 – 对于你的情况,应该使用EXPECT_CALL:

 mockCache.SetTime(10);   // advance 10 seconds
 mockCache.EnableFakeTime();
点赞