gpt4 book ai didi

c++ - 如何模拟库调用?

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:21:15 25 4
gpt4 key购买 nike

cpp 新手(Java 人)。

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

我自己的方法是这样的:

#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;
}

在 Java 中,邮件发送器是接口(interface),它被注入(inject)到我的类中,所以在测试的情况下我注入(inject)模拟。cpp 中模拟库调用的最佳做法是什么?我可以将第 3 方库调用包装在一个类中并注入(inject)该类,但我正在寻找更简单且更常见的做法(可能是 ifndf)。

我熟悉 googlemock。googlemock 允许我模拟类。我不知道如何在我的测试方法中选择如何模拟调用。

最佳答案

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

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

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

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

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

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

There is a list of C mocking frameworks.

关于c++ - 如何模拟库调用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11686897/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com