c++ - 模拟 C++ 标准库

标签 c++ unit-testing mocking standard-library c++-standard-library

我正在用 C++ 对一个类进行单元测试,一些公共(public)方法调用私有(private)方法。我知道约定是测试公共(public)接口(interface),但类的功能取决于这些私有(private)方法如何依次调用其他类及其方法。这在某种意义上类似于公共(public)接口(interface),无论私有(private)函数发生什么变化,它仍然符合 API。

在大多数情况下,我已经能够模拟在私有(private)函数中调用的类来测试 API,但在少数情况下,我遇到了引用标准库的地方,但没有设法模拟它。模拟标准库类等有什么技巧吗?还是我应该跳过它们?

-- 此外,我无法更改源代码或使用模拟库。

最佳答案

如果您真的想模拟标准库,那么最简单(可能是唯一)的方法就是正确检测您的代码。也就是说,不使用 header 和 std命名空间,您必须使用中间名称。

所以发明一个命名空间,称之为mstd .在您的模拟模式下,这将是您的模拟命名空间。在非模拟模式下,这将只是 std 的别名。 .

对于头文件,您必须避免直接包含标准头文件,而是使用模拟层。所以不要包括 <map>你可以包括<mk-map> .然后,此头文件将在标准库和您的版本之间做出决定。大概是这样的:

#ifdef MOCK_MODE
    #include "mock/map.hpp"
#else
    #include <map>
#endif

您也可以为您的编译器提供一个不同的包含路径,一个位于标准库之前的路径。但是,由于您无论如何都必须为命名空间添加别名,因此您仍然必须修改所有代码——因此包含这些特殊 header 同样容易。

这是我能看到它起作用的唯一方法。请注意,使用 LD_PRELOAD 或任何库技术都不起作用:C++ 标准库由大量模板类和内联函数组成。您需要在编译时立即替换它们。

关于c++ - 模拟 C++ 标准库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6604881/

相关文章:

node.js - 如何从fs.statSync stub isFile

java - Mockito 验证参数包含另一个忽略大小写的字符串

c++ - 重载 == 和 !=

c++ - 埃拉托色尼筛法 C++ 不起作用

c++ - 如何编辑格式设置以增加换行长度?

c++ - 在 C++ 中等待通知

c# - 单元测试与任务一起永远运行

unit-testing - 为什么在单元测试时接口(interface)模拟比子类模拟更可取?

java - 如何模拟 "server - android device"通信

c# - 包含从 Request.Form 中挑选的数据的单元测试方法。新手问题