c++ - 测试项目在访问私有(private)静态方法时出现问题,即使我从未直接调用它

标签 c++ googletest

我正在尝试为我的技能添加一些缺失的技能,其中之一是设置适当的并行测试项目。

我在一个项目 (EffCPP) 中有一个简单的设置来试验一些 C++ 概念,我正在尝试在另一个可以访问所有相关文件并测试它们的 Google 测试项目 (Test) 中设置。

不幸的是,在成功设置测试项目后,我开始在测试中从EffCPP项目构建数据时遇到问题。

具体来说,一个链接器错误表明我的测试项目无法链接公共(public)构造函数访问的私有(private)静态方法。

我确信我在这里遗漏了一些关于编译过程的东西,但解决方案似乎并不明显,而且查询本身很难用谷歌搜索。

我在这里有一个所有这些的 github 存储库:https://github.com/Vidrohi/EffectiveCPP.git

有人建议我尝试为问题中的情况创建一个简单的示例。以下是我试图解释的内容:

///////////////////////// EffCPP ////////////////////////////////


/////////////////////////  ClassToBeTested.h ////////////////////////////////


class ClassToBeTested
{
private:
    unsigned int m_id;

    static unsigned int s_currentId;
    static unsigned int GetNextId();

public:

    ClassToBeTested():m_id(GetNextId())
    {}  
}

/////////////////////////  ClassToBeTested.cpp ////////////////////////////////

#include "ClassToBeTested.h"

unsigned int Performance::NonPOD::s_currentId = 0;

unsigned int Performance::NonPOD::GetNextId()
{
    return ++s_currentId;
}

///////////////////////// TestProject ////////////////////////////////

///////////////////////// Tests.cpp /////////////////////////

#include "gtest/gtest.h"
#include "../EffCPP/Chapter6/ClassToBeTested.h" // Just the path where that header is located really

std::string name("NAME");
TEST(name, name) {
    EXPECT_EQ(1, 1); // Just to make sure the test framework is running correctly

    ClassToBeTested cp;
}

编辑 2:有趣的是,我发现了另一个问题,它讨论了几乎相同的问题 link 但这只是建议我设置第三个项目来构建为一个库,然后链接那个静态库。这是唯一的方法吗?

最佳答案

此问题的一个可能解决方案是不从 EffCPP 项目创建可执行文件,而是创建一个静态库。 然后可以轻松地将此静态库提供给测试项目,然后测试项目可以链接它并将其自身作为 exe 运行。

另一个可能的解决方案可以在这个 question 中找到但这需要创建第三个项目。

我仍在寻找一种能够只使用两个项目并将它们构建为 .exe 的方法

关于c++ - 测试项目在访问私有(private)静态方法时出现问题,即使我从未直接调用它,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47387239/

相关文章:

c++ - 在 gtest 中运行线程

c++ - Google测试:错误LNK2019:带有CMake的Visual Studio 2017的未解析外部符号

googletest - 为什么编译器不能识别我的类型参数化测试夹具类的成员?

c++ - 文件输入输出乱码

c++ - 将对象标识符与字符串进行比较

c++ - 保存递归、多值和重复键值对数据的最佳数据结构是什么?

c++ - 在 GUI 中创建非常大的 TreeView (超过 100 万个项目)

c++ - Visual Studio - 程序在分析时运行得更快

c++ - 在测试中测试 C++ 全局变量的最佳方法

c++ - 谷歌模拟-我可以在同一模拟对象上多次调用EXPECT_CALL吗?