GMock:如何返回模拟类变量作为返回值
GMock: How to return mock class variable as the return value
我第一次尝试使用GMock (google mock framework for c++)。我有以下类:
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:
如果有人能让我知道我做错了什么以及如何解决它,我会很感激。提前感谢。
你的问题的解决方案是使它更简单。只要使用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中Return
和Return(ByRef
的差异…
可能-我没有检查这个,调用set成员值,在调用设置这个默认值之前也会工作-但正如我所说-对于您的情况应该使用EXPECT_CALL:
mockCache.SetTime(10); // advance 10 seconds
mockCache.EnableFakeTime();
只是为了记录(和未来的人发现这个问题,像我一样),而PiotrNycz的答案是最好的选择,当你可以这样做(保持测试值直接在测试中)——在某些情况下,它真的是有必要从一个字段或变量返回一个"活的"返回值。
相应的文档在这里;特别是:
-
Return(field)
不起作用(当动作被定义时,它会复制字段的当前值) -
Return(ByRef(field))
also不起作用(它与上面完全相同,与您可能期望的相反) -
ReturnRef(field)
不编译(因为返回类型不是引用) -
ReturnPointee(&field)
是否工作(它返回方法实际调用时的值)
当然,您必须确保无论何时调用该方法,该指针都保持有效,因为它现在被直接使用,而不是复制。
相关文章:
- 如何使用类模拟 C++11 中的 lambda 函数和闭包?
- 在谷歌测试中创建模拟类的向量
- 将模拟类添加到 stl 容器
- 谷歌模拟类似乎没有实现
- 如何使用(GoogleMock)模拟类作为模板参数
- googlemock:无法创建模拟类的对象
- 如何使用 gmock 模拟类中的模板方法
- 没有虚拟方法的模拟类
- 使用 CRTP 模拟类
- 如何用模板方法(c++)模拟类中的多态性
- 谷歌模拟全局模拟对象内存泄漏
- GMOCK 模拟类不继承任何类
- 在谷歌模拟中模拟文件写入过程
- 允许模拟类从最终类继承
- 为gmock自动生成模拟类
- 用c++类模拟指针(包括delete)
- 使用粉刺模式的模拟类
- GMock:如何返回模拟类变量作为返回值
- 模板化模拟类中缺少MOCK_METHODx() 定义'typename'
- 如何使用运算符[]创建模拟类