如何模拟库调用?

Avi*_*ano 5 c++ testing unit-testing

cpp的新手(Java专家)。

我有具有方法sendMail(txt)的第三方库。我不想测试图书馆。我想测试自己的方法,因此,为了做到这一点,我需要模拟库调用。

我自己的方法如下所示:

#include "mailsender.h"

int run(txt){
    analysis(txt);
    ...
    ...
    int status =  sendMail(txt);//sendMail is a 3rd party library call. i need to mock it.its not part of the unit test
    return status;
}
Run Code Online (Sandbox Code Playgroud)

在Java中,mailsender是接口,并且已注入到我的类中,因此在进行测试的情况下,我将注入模拟。在cpp中模拟库调用的良好实践是什么?我可以将第3方库调用包装在一个类中并注入该类,但是我正在寻找更简单且更常见的方法(也许是ifndf)。

我对googlemock很熟悉。googlemock允许我模拟类。我不知道如何在我测试的方法中模拟呼叫。

gbj*_*anb 5

所以我假设你有一个在库中实现的“全局”函数,你都包含一个头文件(以获取定义)和链接(以获取实现)。

您显然需要用您自己的库替换库的实现 - 一个“什么都不做”的库,因此您可以通过两种方式执行此操作:

  • 您将 .dll(或 .so)替换为您自己的实现,该实现具有 3rd 方库公开的所有方法。一旦您编写了所有 3rd 方 lib 函数的新版本,这很容易,但是将它们全部写出来可能会很痛苦。
  • 您暂时删除该库,并在实现这些功能的 .cpp 源文件中替换您对该库的调用。因此,您将在 .cpp 文件中创建自己的 sendMail() 函数,并将其包含在程序中,而不是包含在 mailsender.h 中。

后者更容易,但您可能还需要修改您的程序以不与第 3 方库链接。这也可能需要更改#include,因为某些编译器(例如VC++)允许您在源代码中嵌入链接器指令。如果您这样做,那么您将无法阻止链接器包含第 3 方库。

另一种选择是修改您的代码以使用对 sendMail 调用的不同调用,例如您自己实现的 test__sendMail()。包装这是一个宏,根据您的构建选项有条件地包含您的或实际的函数调用。

如果这是一个 C++ 库,那么您可能可以像以前一样使用模拟框架,但它听起来像是一个 C 库,它们只是提供了一个您直接在代码中使用的函数列表。您可以将库包装在您自己的类中并使用它,而不是直接调用 3rd 方库函数。

有一个 C 模拟框架列表。