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

使用GTest测试类私有成员时遭遇编译错误的解决请求

GTest测试类私有成员时遭遇编译错误的解决请求

问题根源与解决步骤

嘿,我一眼就看到问题所在啦——测试类的名字拼写不匹配!

在你的my_class.hpp里,你声明的友元测试是:

FRIEND_TEST(MyClassTest, AdditionTest);

但在test_my_class.cpp里,你定义的测试类却是:

class MyClasTest : public ::testing::Test  // 这里少了一个's',应该是MyClassTest

名字差了一个字母,GTest自然认不出这个测试有权限访问MyClass的私有成员啦!

第一步:修正测试类的名字

把test_my_class.cpp里的测试类名改成MyClassTest,对应代码修改如下:

class MyClassTest : public ::testing::Test  // 修正拼写错误
{
  protected:
    std::shared_ptr<cool_ns::MyClass> my_class_;
    void SetUp() override
    { my_class_ = std::make_shared<cool_ns::MyClass>();}

    void TearDown() override
    { my_class_.reset();}
};

TEST_F(MyClassTest, AdditionTest)  // 这里的测试类名也要对应修正
{ASSERT_EQ(my_class_->add(2,3), 5);}

第二步:完善测试目录的CMakeLists.txt

另外,你的测试可执行文件还需要链接GTest库和你自己的my_class目标,否则编译后会出现链接错误。把测试目录的CMakeLists.txt修改成这样:

include(CTest)
enable_testing()

find_package(GTest REQUIRED)
include_directories(${GTEST_INCLUDE_DIRS})

# 生成测试可执行文件并链接依赖
add_executable(test_my_class test_my_class.cpp)
target_link_libraries(test_my_class 
    my_class  # 链接我们自己的被测目标
    ${GTEST_LIBRARIES} 
    ${GTEST_MAIN_LIBRARIES}
)

# 将测试添加到CTest,方便后续运行
add_test(NAME MyClassAdditionTest COMMAND test_my_class)

做完这两步之后,重新执行编译命令,应该就能顺利通过啦!


原提问内容

我按照GTest进阶手册的指引搭建了一个项目,项目结构如下:

|-- include / my_class.hpp
|
|-- src    / my_class.cpp
|
|-- tests  / test_my_class.cpp
|          / CMakeLists.txt
|
|-- CMakeLists.txt          

代码文件内容

my_class.hpp
#pragma once

#include <gtest/gtest_prod.h>

namespace cool_ns {

class MyClass {
 public:
  MyClass() {}
  virtual ~MyClass(){}
  private : 
    int add(int x, int y);
    FRIEND_TEST(MyClassTest, AdditionTest);
};
}  // namespace cool_ns
my_class.cpp
#include <my_class.hpp>
int cool_ns::MyClass::add(int x, int y){
        return x+y;
}
test_my_class.cpp
#include <gtest/gtest.h>
#include <my_class.hpp>

class MyClasTest : public ::testing::Test
{
  protected:
    std::shared_ptr<cool_ns::MyClass> my_class_;
    void SetUp() override
    { my_class_ = std::make_shared<cool_ns::MyClass>();}

    // Tear down after each test case
    void TearDown() override
    { my_class_.reset();}
};

TEST_F(MyClasTest, AdditionTest)
{ASSERT_EQ(my_class_->add(2,3), 5);}

CMake配置文件

主目录CMakeLists.txt
cmake_minimum_required(VERSION 3.9.1)
project(my_class VERSION 1.0 LANGUAGES CXX)

set(CMAKE_EXPORT_COMPILE_COMMANDS 1)
set(CMAKE_CXX_FLAGS  "${CMAKE_CXX_FLAGS} -std=c++17")
include_directories(
    include
)
add_executable(
    my_class
    src/my_class.cpp
)
add_subdirectory(tests)
测试目录CMakeLists.txt
include(CTest)

enable_testing()

find_package(GTest REQUIRED)

add_executable(
    test_my_class
    test_my_class.cpp
)

编译错误信息

执行mkdir build && cd build && cmake .. && make后遇到如下错误:

test_my_class.cpp:24:33: error: ‘int cool_ns::MyClass::add(int, int)’ is private within this context
   24 |     ASSERT_EQ(my_class_->add(2,3), 5);

请问我该怎么解决这个问题呢?谢谢!


备注:内容来源于stack exchange,提问作者bhomaidan90

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.15 10:12:58