我有一个接口(interface)类说:
class MyInterface
{
public:
virtual int doThing(int x, int y, int z) = 0;
};
我想编写一个模拟实现以在我的测试中使用。例如,传统上,如果不使用 Google Mocks,我会这样写:
class MyMock : public MyInterface
{
public:
virtual int doThing(int x, int y, int z)
{
if (x == 1)
return y + z;
else
return y - z;
}
};
我将如何在谷歌模拟中做到这一点。请注意,我不想(好吧,我不需要)设置关于如何调用此模拟的期望。我只是用它来测试其他东西。
你会怎么做(最清晰的方法是什么)?我发现 google 模拟文档有点过于简洁,无法弄清楚这一点。
最佳答案
包含 Google Mock 头文件:
#include <gmock/gmock.h>
声明一个模拟类:
struct MyMock : MyInterface
{
MOCK_METHOD3( doThing, int(int x, int y, int z) );
};
将模拟实例化为NiceMock(它不会在未注册的调用时发出任何警告):
testing::NiceMock<MyMock> mock;
将任何内容匹配器引入范围:
using testing::_;
使用以下选项之一使用 ON_CALL
而不是 EXPECT_CALL
定义默认行为:
选项#1
硬编码默认返回值:
ON_CALL( mock, doThing(_,_,_) ).WillByDefault(testing::Return(0));
// default return value ~~^
选项#2
将调用委托(delegate)给全局函数:
int foo(int x, int y, int z)
{
if (x == 1)
return y + z;
else
return y - z;
}
ON_CALL( mock, doThing(_,_,_) ).WillByDefault(testing::Invoke(foo));
选项#3
将调用委托(delegate)给 lambda 表达式 (C++11):
ON_CALL( mock, doThing(_,_,_) ).WillByDefault(testing::Invoke(
[] (int x, int y, int z)
{
if (x == 1)
return y + z;
else
return y - z;
}
));
选项#4
使用 Boost.Lambda 库构建 lambda 表达式:
#include <boost/lambda/lambda.hpp>
#include <boost/lambda/if.hpp>
using namespace boost::lambda;
ON_CALL( mock, doThing(_,_,_) ).WillByDefault(testing::Invoke(
ret<int>(if_then_else(_1 == 1, _2 + _3, _2 - _3))
));
// or: ret<int>(if_(_1 == 1)[_2 + _3].else_[_2 - _3])
关于c++ - 使用 Google Mocks,如何在不关心/设置任何调用期望的情况下给出模拟实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32873490/