我正在用 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/