假设我们有以下类A和B
class A
{
virtual void Init() { DoSomething(); }
};
class B : public A
{
virtual void Init() { DoSomethingSpecial(); A::Init(); }
};在我们的单元测试中,我们只想测试B,也就是使用调用B::Init()实际上调用DoSomethingSpecial()的希波莫克进行测试。
B* b_p = new B();
m_mockRepository_p->ExpectCall(b_p, DoSomethingSpecial);
b_p->Init();现在,我们不希望所有的调用都来自A的Init(),所以我们想编写如下内容:
m_mockRepository_p->ExpectCall(b_p, A::Init);最后一个期望会导致一个未处理的异常,我认为这个异常是可以的,因为我们将调用的方法与我们想要的基本版本混合在一起。将b_p转换为A无助于此。
对于这个特定的用例,有什么解决方案吗?
发布于 2014-01-19 22:25:16
..。这是一个有趣的故事。我觉得解决不了这个问题。对A::Init的调用不是通过虚拟函数表完成的(因为您明确知道要调用哪个函数),因此它属于非虚拟函数,您不能模拟它。
添加这一点的一个复杂因素是,如果您在B上使用A::Init的地址,您仍然会得到vtable指针,因此如果您愿意,甚至无法替换该函数(例如,使用C函数模拟逻辑)。
我只能推荐通用重构解决方案来解决这个问题--使A和B独立类,使B包含A(私有继承)或从A和B提取接口并将B转换为装饰器。最后一个听起来最好,但这取决于什么是A和B。
https://stackoverflow.com/questions/18782019
复制相似问题