【问题标题】:HippoMocks mocking return values by refHippoMocks 通过 ref 模拟返回值
【发布时间】:2012-08-02 07:35:02
【问题描述】:
class IEmployeeServiceProxy
{
public:
    virtual ~IEmployeeServiceProxy() { }
    virtual void AddEmployee(const Employee&) = 0;
    virtual int GetEmployees(std::vector<Employee>&) = 0;
};

struct Employee
{
    boost::uuids::uuid Id;
    std::string Name;
};

m_Mocks.ExpectCall(m_EmpSvcMock.get(), IEmployeeServiceProxy::GetEmployees).Return???;

如何模拟它,以便它通过参数而不是 int(这是方法的返回类型)返回 std::vector?

另外,如果有超过 1 个 ref 参数怎么办?

【问题讨论】:

    标签: c++ unit-testing mocking hippomocks


    【解决方案1】:

    您必须自己提供引用的对象,确保模拟使用With 使用它,并且您可以更改它,将函数传递给Do,它还提供返回值。有多少参考参数并不重要。示例:

    int AddSomeEmployees( std::vector< Employee >& v )
    {
      v.push_back( Employee() );
      return 0;
    }
    
      //test code
    std::vector< int > arg;
    
    mocks.ExpectCall( empSvcMock, IEmployeeServiceProxy::GetEmployees ).With( arg ).Do( AddSomeEmployees );
    

    请注意,Do 可以采用任何类型的函数,也可以采用 std::function、lambdas 等。

    【讨论】:

    • 啊,这很有帮助!谢谢。
    • 您能添加一个通过 C++0x/11 lambda 实现的示例吗?我尝试了Do([] -&gt; int (std::vector&lt;Employee&gt;&amp; employees){}),但 GCC 4.5.3 一直抱怨没有与 TCall<...>.Do(...) 匹配的函数。
    • 发现问题。 HippoMocks 将 Do 的参数声明为 ref,并且不允许对 temp lambda 进行引用。向 Dascandy 提交补丁。
    【解决方案2】:

    Git 版本(最新版本)有一个 Out 参数选项,几乎就是这样。使用

    std::vector<int> args; args.push_back(1); args.push_back(2);
    mocks.ExpectCall(mock, IInterface::function).With(Out(arg));
    

    【讨论】:

    • Git版本和SVN版本类似吗?如果没有,我在哪里可以获得 Git 版本(最好是压缩包)?
    • assembla.com/code/hippomocks/git/nodes 是我上次自己测试的 git 版本(Github 上有一个较新的提交分支,但其中包含一些我尚未检查的更改)。它应该相似但更新。据我记得,唯一实际改变的(与添加的相反)是类模拟不再初始化成员,但有一个新函数 MemberMock 替换它。您可能以前没有使用过它,因为它不是典型的使用方法。
    • @dascandy 你知道 hippomocks 是否还在积极开发中?
    • @stjin: Dascandy 是开发者 :)
    • @dascandy 你能否提供更多关于如何使用“In”和“Out”选项的文档/解释?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-28
    • 2017-06-29
    • 1970-01-01
    • 2015-12-15
    相关资源
    最近更新 更多