【问题标题】:Visual C++ overrides/mock objects for unit testing?Visual C++ 覆盖/模拟对象以进行单元测试?
【发布时间】:2010-05-05 22:42:59
【问题描述】:

当我运行单元测试时,我希望能够“存根”或创建一个模拟对象,但我遇到了 DLL Hell。

例如:构建了两个 DLL 库:A.dll 和 B.dll -- A.dll 中的类调用了 B.dll 中的类,因此在构建 A.dll 时,链接行使用 B。 lib 用于定义。

我的测试驱动程序 (Foo.exe) 正在测试 A.dll 中的类,因此它链接到 A.lib。但是,我想用简单的版本“删除” A.dll 对 B.dll 的一些调用(返回基本值、不查找数据库等)。

我无法构建只覆盖所需方法(不是整个类)并替换 B.dll 的 Override.dll,因为 Foo.exe 会 A)抱怨如果我只是删除它并放置 Override,B.dll 丢失.dll 或 B)如果我将 Override.dll 重命名为 B.dll,Foo.exe 会抱怨存在未解析的符号,因为 Override.dll 不是 B.dll 的完整实现。

有没有办法做到这一点?有没有办法将 Foo.exe 与 A.lib、B.lib 和 Override.lib 静态链接,这样它就可以工作而无需完全重建 A.lib 和 B.lib 以删除 __delcspec(dllexport)?还有其他选择吗?

【问题讨论】:

    标签: unit-testing visual-c++ linker dll


    【解决方案1】:

    如果在链接对象模块列表中找不到函数,链接器只会搜索库。解决方案是将存根构建到与测试驱动程序模块链接的对象模块中。

    【讨论】:

    • 问题是B.dll中的类的头文件中的类上有一个__delcspec(dllimport/dllexport)宏。我的理解是,它告诉链接器在外部 dll 中查找此类的实现。因此,我认为如果不修改包含的标头,我就无法以这种方式进行覆盖。创建 .obj 会导致“不一致的 dll 链接”警告,并且运行 Foo.exe 仍然会忽略覆盖。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-22
    • 2015-08-30
    • 2018-10-21
    • 2015-05-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多