【问题标题】:Using Google Mocks, how to give a mock implementation without caring about / setting any expectation of invocation使用 Google Mock,如何在不关心/设置调用期望的情况下提供模拟实现
【发布时间】:2015-12-28 16:13:27
【问题描述】:

我有一个接口类说:

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 mocks 文档过于简洁,无法弄清楚。

【问题讨论】:

    标签: c++ unit-testing googlemock


    【解决方案1】:

    包含 Google Mock 头文件:

    #include <gmock/gmock.h>
    

    声明一个模拟类:

    struct MyMock : MyInterface
    {
        MOCK_METHOD3( doThing, int(int x, int y, int z) );
    };
    

    将模拟实例化为 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 库构建 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])
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-11-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多