使用gmock-global做单元测试遇全局函数重定义问题求解决方案
解决gmock-global全局函数模拟的多重定义问题
问题根源
你在classATests.cpp和classBTests.cpp中都使用了MOCK_GLOBAL_FUNC0(giveIndex, int(void)),这个宏会生成全局的mock实例(gmock_globalmock_giveIndex_instance)以及mock函数的定义。当两个测试文件一起编译链接时,全局符号重复,就会触发multiple definition错误。
解决方案
通过分离mock的声明与定义,确保全局mock实例仅被定义一次,同时保持两个测试文件独立:
1. 创建全局mock声明头文件
在ut目录下新建mock_global.hpp,内容如下:
#pragma once #include <gmock-global/gmock-global.h> // 仅声明全局mock函数,不生成具体定义 DECLARE_GLOBAL_MOCK_FUNC0(giveIndex, int(void));
2. 创建全局mock定义文件
在ut目录下新建mock_global.cpp,内容如下:
#include "mock_global.hpp" // 生成全局mock的实际定义,仅在该文件中定义一次 DEFINE_GLOBAL_MOCK_FUNC0(giveIndex, int(void));
3. 修改测试文件
调整classATests.cpp
移除原有的MOCK_GLOBAL_FUNC0(giveIndex, int(void));,替换为包含mock_global.hpp,同时修正两处语法错误:
#include <memory> #include <gtest/gtest.h> #include <gmock/gmock.h> #include "mock_global.hpp" #include "src/classA.hpp" using namespace ::testing; struct classATests : public ::testing::Test { void SetUp() override // 修正拼写:原Setup改为SetUp { sut_ = std::make_shared<A>(); } std::shared_ptr<A> sut_; }; TEST_F(classATests, checkIndex) { EXPECT_GLOBAL_CALL(giveIndex, giveIndex()).WillOnce(Return(1)); sut_->checkIndex(); }
调整classBTests.cpp
同样移除MOCK_GLOBAL_FUNC0,替换为包含mock_global.hpp,并修正语法错误:
#include <memory> #include <gtest/gtest.h> #include <gmock/gmock.h> #include "mock_global.hpp" #include "src/classB.hpp" using namespace ::testing; struct classBTests : public ::testing::Test { void SetUp() override // 修正拼写:原Setup改为SetUp { sut_ = std::make_shared<B>(); } std::shared_ptr<B> sut_; }; TEST_F(classBTests, checkIndex) { EXPECT_GLOBAL_CALL(giveIndex, giveIndex()).WillOnce(Return(1)); sut_->checkIndex(); }
4. 编译调整
编译测试代码时,将mock_global.cpp加入编译列表,确保全局mock的定义被正确链接到测试程序中。
额外说明
- Google Test的测试类初始化函数是
SetUp(大写U),原代码中的Setup拼写错误,会导致初始化逻辑不执行,需修正。 - 原代码中
using namespace ::testing缺少分号,属于语法错误,需补上。
内容的提问来源于stack exchange,提问作者nanika
相关产品推荐
相关产品推荐

