测试项目在访问私有静态方法时遇到问题,即使我从未直接调用它

时间:2017-11-20 07:47:47

标签: c++ googletest

我正在努力为我的保留节目添加一些缺失的技能,其中一个是建立一个适当的并行测试项目。

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

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

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

我确信我在这里遗漏了一些有关编译过程的内容,但解决方案似乎非常明显,查询本身很难谷歌。

我在这里有一个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 但这只是建议我设置第三个项目来构建一个lib然后链接那个静态库。这是唯一的方法吗?

1 个答案:

答案 0 :(得分:0)

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

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

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