Dnj*_*Abc 6 c++ unit-testing googletest googlemock gmock
我正在尝试首次使用GMock(适用于c ++的Google模拟框架)。我有以下课程:
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);
};
Run Code Online (Sandbox Code Playgroud)
该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));
}
Run Code Online (Sandbox Code Playgroud)
当我运行测试时,我希望该mCurrentTime值可以由我的模拟GetCurrentTime函数返回。但是,我得到以下错误输出:
GMOCK WARNING:
Uninteresting mock function call - taking default action specified at:
..../test_local_cache.cpp:62:
Function call: GetCurrentTime()
Returns: 0
Stack trace:
Run Code Online (Sandbox Code Playgroud)
如果有人可以让我知道我在做什么错以及如何解决它,将不胜感激。提前致谢。
只是为了记录(以及未来发现这个问题的人,比如我),而PiotrNycz 的答案是您可以做到的最佳选择(将测试值直接保留在测试中)——在某些情况下,确实有必要返回“实时” " 从字段或变量返回值。
适当的文档在这里;尤其:
Return(field)不起作用(定义操作时它会复制字段的当前值)Return(ByRef(field)) 也不起作用(它的作用与上面完全相同,与您的预期相反)ReturnRef(field)无法编译(因为返回类型不是引用)ReturnPointee(&field) 确实有效(它返回实际调用该方法时的值)当然,您必须确保每当调用该方法时指针对象都保持有效,因为现在直接使用它而不是制作副本。
解决你的问题的方法是以更简单的方式解决它。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));
}
Run Code Online (Sandbox Code Playgroud)
只是为了回答为什么你的例子不起作用 - 通过这个调用,你的成员变量的当前值被存储 - 稍后对其进行更改没有效果:
ON_CALL(*this, GetCurrentTime()).WillByDefault(Return(mCurrentTime));
Run Code Online (Sandbox Code Playgroud)
在google-mock-docReturn中查找和之间的区别Return(ByRef...
可能 - 我没有检查这一点,调用设置成员值,在调用设置此默认值之前也可以工作 - 但正如我所说 - 对于您的情况,应使用 EXPECT_CALL :
mockCache.SetTime(10); // advance 10 seconds
mockCache.EnableFakeTime();
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
8508 次 |
| 最近记录: |