c++ - 使用 Google Mocks,如何在不关心/设置任何调用期望的情况下给出模拟实现

标签 c++ unit-testing googlemock

我有一个接口(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/

相关文章:

Javascript 单元测试框架

c++ - Google Mock 未报告低于预期的通话

c++ - GTest 中的嵌套匹配器

c++ - 矩阵比 cpp 中的预期重 10 倍

c++ - Qt 中的锁位。如何实现?

java - mockito 验证未使用参数调用的方法

asp.net-mvc - 如何将存储库注入(inject) wcf 服务?

C++:传递具有任意数量参数的函数作为参数

c++ - 如何调试启动但似乎什么都不做的程序?

c++ - google mock - 保存 EXPECT_CALL 然后重新使用和更改子句