如何在从dll导出的模板类型中模拟具体对象?

时间:2017-11-03 14:00:49

标签: c++ unit-testing templates gmock

我有一个从dll(动态链接库)导出的应用程序Application对象类型,如此,

//App.h
class __declspec(dllexport) Application
{
    Utility utility;
public:
    Application();
    void Foo();
    void Bar();
    ~Application();
};

它"有一个"它通过其Foo和Bar导出用于提供一些关键功能的实用程序。由于实用程序是具体的,我遵循GMock引物中给出的mock non-virtual methods using templates。所以我让我的应用看起来如下,

//App.h - modified
template <class Utility>
class __declspec(dllexport) Application
{
    Utility utility;
public:
    Application();
    void Foo();
    void Bar();
    ~Application();
};

现在我已经模仿了我的类型,我将使用Application<ConcreteUtility>进行生产,并且我想使用Application<MockUtility>进行测试。该应用程序的.cpp文件现在如下所示,专门用于Application<ConcreteUtility>

//.cpp
template class Application<ConcreteUtility>;
Application<ConcreteUtility>::Application() {/*construct app with the concrete utility*/}
Application<ConcreteUtility>::Foo() {/*implement Application's foo using the concrete utility*/}
Application<ConcreteUtility>::Bar {/*implement Application's bar using the concerete utility*/}
Application<ConcreteUtility>::~Application() {/*destroy the Application*/ }

我已经编写了一个单元测试应用程序,它将在加载时链接到我的应用程序dll(.h和.lib导入库)。当我使用GMock框架时,我嘲笑了这样的实用程序,

class MockUtility
{
public:
    /*mock all public methods of utility that the application could have possibly used*/
    MOCK_METHOD1(FuncUsingANetworkConnection, void(int));
    MOCK_METHOD0(FuncUsingADatabase, int());
    MOCK_METHOD0(FuncReadingAndWritingFromDisk, int());
    MOCK_METHOD2(FuncManipulatingWindowsRegistry, int(long, long));
    MOCK_METHOD0(FuncSomeMoreUnreliableResource, int());
};

现在,在我的测试夹具中,我实例化了Application<MockUtility>。它编译,但链接时无法找到Application<MockUtility>::Application() - 构造函数Application<MockUtility>::Foo()的定义 - Application<MockUtility>Application<MockUtility>::Bar()以及{{1}的foo }。它开始在这里抱怨。

我可以看到它确实没有在任何地方定义,但我如何使这项工作?我不能重构和提取这个实​​用程序的接口,因为它太毛茸茸了。但是我想以某种方式单独测试这个应用程序的功能。

我不想污染App的实现,使用单元测试内容并单独为Application<MockUtility>::~Application()编写实现。即使我能做到这一点,我也无法将应用程序中的所有更改都带到我每次应用更改时编写的新实现中。

我不确定这是否有意义,但我会继续问:我希望编译器和链接器理解Application<MockUtility>只是具有{{1}实现的应用程序来自Application<MockUtility>我写的。

这件事有可能吗? 如果没有,我如何模拟对此utility对象进行的调用?

0 个答案:

没有答案