You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.12 06:20:26