【问题标题】:Calling a method when expected method on mock was invoked调用模拟上的预期方法时调用方法
【发布时间】:2011-04-27 16:18:42
【问题描述】:

我有以下场景:

类接口A; 类接口B; 类接口C; 类接口A { 虚拟 void foo(InterfaceC&) = 0; }; 类接口B { 虚拟空条()= 0; }; 类接口C { 虚空 bla() = 0; }; // 模拟 模拟类A:公共接口A { 上市: MOCK_METHOD0(foo, void(InterfaceC&)); }; MockB 类:公共接口 B { 上市: MOCK_METHOD0(bar, void()); }; 类 ImplC:公共接口 C { 上市: ImplC(InterfaceA& a, Interface& b) : m_a(a), m_b(b) {} 无效 doSomething() { m_a.foo(*this); } 虚空 bla() { m_b.bar(); } }; 模拟A模拟A; 模拟B模拟B; EXPECT_CALL(mockA, foo()); ImplC impl(mockA, mockB); impl.doSomething(); // 将在 mockA 上调用 foo

如果调用 doSomething,则会在 MockA 上调用 foo。如果将调用 foo,我如何触发方法 bla 的调用?是否有可能以某种方式创建如下期望:

EXPECT_CALL(mockA, foo()).WillOnce(Invoke(impl.bla()));

?

我希望答案很清楚,例子也是。

提前致谢。 市场

【问题讨论】:

    标签: mocking googlemock expectations


    【解决方案1】:
    EXPECT_CALL(mockA, foo()).WillOnce(InvokeWithoutArgs(&impl, &ImplC::bla));
    

    应该可以。如果必须传递更复杂的参数,请使用 boost::bind(注意参数列表中类实例和方法的顺序不同):

    EXPECT_CALL(mockA, foo())
        .WillOnce(Invoke(boost::bind(&ImplC::bla, &impl, other_params)));
    

    如果给foo() 提供了一些应该传递给bla() 的参数,请使用WithArgs

    EXPECT_CALL(mockA, foo(Lt(1), _))
        .WillOnce(WithArgs<0>(Invoke(&impl, &ImplC::bla)));
    

    还可以查看 Google Mock Cheat Sheet wiki page - 它提供了有关函数和方法调用操作的更多信息。

    【讨论】:

    • 非常感谢弗拉德。这就是我一直在寻找的。我读过 gmock 的 Cookbook,但 CheatSheet 更紧凑更好。再次感谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多