调用模拟上的预期方法时调用方法

Posted

技术标签:

【中文标题】调用模拟上的预期方法时调用方法【英文标题】: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()));

?

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

提前致谢。 市场

【问题讨论】:

【参考方案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 更紧凑更好。再次感谢。

以上是关于调用模拟上的预期方法时调用方法的主要内容,如果未能解决你的问题,请参考以下文章

页面处于激活状态时调用Js方法

在 vue-multiselect 中测试 vuex 操作时调用了 Jest 预期的模拟函数

在Websphere Application Server上的应用程序启动时未调用MDB的ejbCreate()方法

从后台调用应用程序时调用方法

魔术方法

魔术方法