使用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
相关产品推荐
相关产品推荐

