如何使用析构函数资源释放来模拟C ++类?

时间:2015-01-16 13:53:53

标签: c++ googletest googlemock

我正在尝试使用Google模拟模拟一个C ++类进行测试。该类在ctor中分配共享内存资源,并在dtor中释放它们。但我的模拟不需要或不使用这些资源。

我可以提供一个不同的,受保护的ctor,它不分配资源,这不会改变其他已经存在的ctors。但是dtor仍会尝试解除分配失败的失败。

我正在寻找建议。我可以改变测试中的代码,我有源代码,这是我们的代码。但是我更愿意尽可能少地改变我们的生产代码,原因有两个:1)我不想冒险改变行为,以至于我没有真正测试相同的代码,2)这种模式ctor alloc / dtor dealloc可能会在整个代码中发生很多很多次,而我所做的任何更改都可能导致越来越多的工作。

过度简化的伪c ++代码示例:

class MyClass : MyBaseClass {
    MyClass(int a) : myResource(0) { slowAllocation(myResource, a); }
    // dtor dies horribly if myResources isn't a valid resource
    virtual ~MyClass() { deallocate(myResource); }
protected:
    MyClass() : myResource(0) {} // for test
    MyResourceClass *myResource;
}

思路:

A)改变dtor,使其在测试模式下运行时不会释放。这可能是#ifdef'ed最有可能。这可能不会太糟糕,只要#ifdef永远不会被构建错误地设置。

B)Stackoverflow faeries在我眼前消失了我的问题。

C)重构代码,更改继承并引入工厂,这样我就可以避免继承我不想要的代码。我曾经写过很多Java,我正在考虑接口/具体的类分离。这可能会有未来的好处,还有一些其他情况,我想派生一个类并将实现从使用链表改为并发集,但我仍然需要携带链表成员(如头指针) )我不再使用(因为我不能以我覆盖方法的方式取消定义数据成员)。

我以为我会尝试B),但是我没有倾向于A) - 除非观众看到其他问题。 C)是很多工作,我宁愿这样做只是因为需要逐个案例。

任何人都有遇到过类似问题的经历吗?

0 个答案:

没有答案