c++ - GMock : How to return mock class variable as the return value

标签 c++ unit-testing googletest googlemock

我是第一次尝试使用 GMock(用于 C++ 的谷歌模拟框架)。我有以下类(class):

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:

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

最佳答案

仅作记录( future 的人会发现这个问题,比如我),而 PiotrNycz's answer如果可以的话,这是最好的选择(将测试值直接保存在测试中)——在某些情况下,确实有必要从字段或变量返回“实时”返回值。

相应的文档是 here ;特别是:

  • Return(field) 不起作用(它在定义操作时复制字段的当前值)
  • Return(ByRef(field)) 不起作用(它的作用与上面完全相同,与您的预期相反)
  • ReturnRef(field) 无法编译(因为返回类型不是引用)
  • ReturnPointee(&field) 确实有效(它返回实际调用该方法时的值)

当然,您必须确保无论何时调用该方法,指针都保持有效,因为它现在被直接使用,而不是制作拷贝。

关于c++ - GMock : How to return mock class variable as the return value,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32534306/

相关文章:

c++ - Tensorflow Serving bazel 构建错误 : mnist_inference_2. cc - 尚未声明签名

c# - 对装饰器模式进行单元测试

c++ - 只有数组的一个元素被传递给函数。 C++

C# 模拟具体类。如何?

c++ - GoogleTest for Android NDK C++ with CMake

googletest - 使用 gtest 编写具有多个模板参数的测试

c++ - 从 opengl 中的模型获取可见的 XYZ 坐标和法线

c++ - C++线程库异常

c++ - 大对象线程间通信的最佳实践

javascript - AngularJs 单元测试失败,因为 Karma 无法识别 Controller 中的监听器 $scope.$