首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Hippomocks中的模拟基类方法

Hippomocks中的模拟基类方法
EN

Stack Overflow用户
提问于 2013-09-13 08:47:10
回答 1查看 797关注 0票数 0

假设我们有以下类AB

代码语言:javascript
复制
class A
{
    virtual void Init() { DoSomething(); }
};

class B : public A
{
    virtual void Init() { DoSomethingSpecial(); A::Init(); }
};

在我们的单元测试中,我们只想测试B,也就是使用调用B::Init()实际上调用DoSomethingSpecial()希波莫克进行测试。

代码语言:javascript
复制
B* b_p = new B();
m_mockRepository_p->ExpectCall(b_p, DoSomethingSpecial);
b_p->Init();

现在,我们不希望所有的调用都来自AInit(),所以我们想编写如下内容:

代码语言:javascript
复制
m_mockRepository_p->ExpectCall(b_p, A::Init);

最后一个期望会导致一个未处理的异常,我认为这个异常是可以的,因为我们将调用的方法与我们想要的基本版本混合在一起。将b_p转换为A无助于此。

对于这个特定的用例,有什么解决方案吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-01-19 22:25:16

..。这是一个有趣的故事。我觉得解决不了这个问题。对A::Init的调用不是通过虚拟函数表完成的(因为您明确知道要调用哪个函数),因此它属于非虚拟函数,您不能模拟它。

添加这一点的一个复杂因素是,如果您在B上使用A::Init的地址,您仍然会得到vtable指针,因此如果您愿意,甚至无法替换该函数(例如,使用C函数模拟逻辑)。

我只能推荐通用重构解决方案来解决这个问题--使A和B独立类,使B包含A(私有继承)或从A和B提取接口并将B转换为装饰器。最后一个听起来最好,但这取决于什么是A和B。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18782019

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档