我有一个接口类说:
class MyInterface
{
public:
virtual int doThing(int x, int y, int z) = 0;
};
我想写一个模拟实现用于我的测试。传统上,在不使用Google mock的情况下,我会这样写:
class MyMock : public MyInterface
{
public:
virtual int doThing(int x, int y, int z)
{
if (x == 1)
return y + z;
else
return y - z;
}
};
我如何在谷歌模拟中做到这一点。请注意,我不想(好吧,我不需要)设置如何调用这个mock的期望。我只是用它来测试别的东西。
你会怎么做(什么是最清楚的方式)?我发现google mocks文档有点太简洁了,无法弄清楚这一点。
包含Google Mock头文件:
#include <gmock/gmock.h>
声明一个模拟类:
struct MyMock : MyInterface
{
MOCK_METHOD3( doThing, int(int x, int y, int z) );
};
将mock实例化为NiceMock(它不会对未注册的调用发出任何警告):
testing::NiceMock<MyMock> mock;
将anything匹配器带到作用域:
using testing::_;
使用以下选项之一定义ON_CALL
而不是EXPECT_CALL
的默认行为:
选项# 1
硬编码一个默认返回值:
ON_CALL( mock, doThing(_,_,_) ).WillByDefault(testing::Return(0));
// default return value ~~^
选项# 2
将调用委托给全局函数:
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
将调用委托给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表达式。图书馆λ:
#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])