如何使用GoogleTest测试仅在CPP文件中定义的函数
GoogleTest测试CPP文件中未暴露工具方法的最佳方案
刚接触GoogleTest框架,想测.cpp里定义的baz()这种没在.hpp里暴露的工具函数?而且不想为了测试就把它公开到头文件里?这确实是个常见的痛点,我给你分享几个靠谱的实现方案,都是实践中验证过的:
方案一:使用friend关键字让测试代码访问私有函数
这是最直接的方式,你可以在baz()的定义所在的.cpp文件里,把GoogleTest的测试类或者测试函数声明为friend,这样测试代码就能直接调用它了。
修改你的.cpp文件:
#include ".hpp" // 提前声明测试用的test fixture或者测试函数 namespace ns_test { TEST_F(MyTestFixture, TestBaz); } void baz() { } // 把测试函数设为baz的友元 friend void ns_test::TestBaz(MyTestFixture*); namespace ns { void foo() { baz(); } void bar() { baz(); } }
不过要注意,这种方式会让测试代码和生产代码有一点编译层面的耦合,但完全不会影响生产环境的运行逻辑。
方案二:条件编译暴露测试专用声明
你可以在.cpp文件里添加条件编译的代码,只有当测试宏(比如自定义的UNIT_TEST)被定义时,才暴露baz()的声明给测试代码。
修改你的.cpp文件:
#include ".hpp" // 只在测试模式下暴露baz的声明 #ifdef UNIT_TEST extern void baz(); #endif void baz() { } namespace ns { void foo() { baz(); } void bar() { baz(); } }
然后在你的测试文件编译时,加上-DUNIT_TEST的编译选项,这样测试代码就能看到baz()的声明并正常调用了。
方案三:迁移到内部专用头文件
如果这类未暴露的工具函数比较多,你可以创建一个只供内部实现和测试用的头文件(比如internal_utils.hpp),把baz()的声明放在这个头文件里,生产代码的公开.hpp不包含它,只有业务.cpp和测试文件包含这个内部头。
比如创建internal_utils.hpp:
#pragma once void baz();
然后修改你的业务.cpp文件:
#include ".hpp" #include "internal_utils.hpp" void baz() { } namespace ns { void foo() { baz(); } void bar() { baz(); } }
测试文件里直接包含internal_utils.hpp就能调用baz()了,这种方式结构更清晰,适合有多个内部工具函数的场景。
内容的提问来源于stack exchange,提问作者Pajunen
相关产品推荐
相关产品推荐

