使用Google mock,如何在不关心/设置任何调用期望的情况下提供模拟实现



我有一个接口类说:

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])

最新更新