ace*_*ace 2 c++ unit-testing mocking std standard-library
我正在对 C++ 中的一个类进行单元测试,一些公共方法调用私有方法。我知道约定是测试公共接口,但类的功能取决于这些私有方法如何依次调用其他类及其方法。这与公共接口类似,无论私有函数发生什么,它仍然符合 API。
我已经能够在大部分情况下模拟私有函数中调用的类来测试 API,但在少数情况下,我遇到了引用标准库的地方,但未能成功模拟它。模拟标准库类等有什么技巧吗?或者我应该跳过它们?
-- 另外,我无法更改源代码或使用模拟库。
如果您确实希望模拟标准库,那么最简单(可能是唯一)的方法就是正确检测您的代码。也就是说,std您必须使用中间名称,而不是直接使用标头和名称空间。
所以发明一个命名空间,称之为mstd。在您的模拟模式下,这将是您的模拟名称空间。在非模拟模式下,这只是std.
对于头文件,您必须避免直接包含标准头,而是使用模拟层。因此,<map>您可以包含<mk-map>. 然后,该头文件将在标准库和您的版本之间做出决定。也许是这样的:
#ifdef MOCK_MODE
#include "mock/map.hpp"
#else
#include <map>
#endif
Run Code Online (Sandbox Code Playgroud)
您也可以为编译器提供不同的包含路径,该路径位于标准库之前。但是,由于无论如何您都必须为名称空间添加别名,因此您仍然需要修改所有代码 - 因此包含这些特殊标头也同样容易。
这是我能看到它发挥作用的唯一方法。请注意,使用 LD_PRELOAD 或任何库技术都不起作用:C++ 标准库由大量模板类和内联函数组成。您需要在编译时替换它们。