【问题标题】:Mock Methods that are not virtual非虚拟的模拟方法
【发布时间】:2017-11-29 06:17:30
【问题描述】:

我有一个班级说 A 如下所述:

class A
{
void show()
{}
int data(int x)
{}
.....
};

我需要模拟这个类——因为成员函数不是虚拟的——我可以像下面提到的那样设计我的模拟类吗:

class MockA : public A
{
MOCK_METHIOD0(show, void ());
MOCK_METHIOD1(data, int (int));
}

我可以用这种方式实现吗,MockA 是否有机会错过对 A类的任何功能? 使用 MockA 创建的对象无论如何都会调用 A 类的实际方法实现?

【问题讨论】:

    标签: c++ c++11 gmock


    【解决方案1】:

    通常对于这种情况,您没有从A 继承的模拟,而是使用编译时机制来选择是使用实现类还是模拟类。例如。模板化使用A 的所有内容,然后使用AMockA 实例化模板,以在测试设置中将生产类替换为模拟类。任何未在模拟中实现但被调用的方法都会导致编译时错误。模拟定义中宏的使用几乎相同,即使方法是非虚拟的。

    困难的部分是到处替换类。模板,通过宏引用类名,或者使用相同的类名并确保只有一个被链接都是可能的。

    【讨论】:

    • 但是如果对象是用 MockA 创建的,上面的方法不会覆盖实际的实现吗?
    • 不确定您所说的“覆盖实际实现”是什么意思。非虚拟方法按名称链接,因此编译器要么生成直接调用,例如A::showMockA::show。请注意,即使在虚拟方法的情况下,模拟通常也不是从实现继承,而是从实现也继承自的接口。
    猜你喜欢
    • 2012-07-29
    • 2013-05-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-25
    • 1970-01-01
    • 2010-11-07
    • 1970-01-01
    • 2015-06-13
    相关资源
    最近更新 更多