测试项目在访问私有静态方法时出现问题,即使我从未直接调用它
Test project has problems accessing a private static method, even though I never directly call it
我正在尝试为我的技能添加一些缺失的技能,其中之一是设置适当的并行测试项目。
我在一个项目 (EffCPP) 中有一个简单的设置来试验一些 C++ 概念,我正在尝试在另一个可以访问所有相关文件和的项目中设置一个 Google 测试项目(测试)测试它们。
不幸的是,在成功设置测试项目后,我开始在 Test 中从 EffCPP 项目构建数据时遇到问题。
具体来说,一个 linker 错误表明我的测试项目不能 link public 构造函数访问的私有静态方法。
我确信我在这里遗漏了一些关于编译过程的东西,但解决方案似乎并不明显,而且查询本身很难 google。
我有一个 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
但这只是建议我设置第三个项目作为库构建,然后 link 那个静态库。这是唯一的方法吗?
此问题的一个可能解决方案是不从 EffCPP
项目创建可执行文件,而是创建一个静态库。
这个静态库可以很容易地提供给测试项目,然后可以 link 它和 运行 本身作为一个 exe。
在此 question 中可以找到另一种可能的解决方案,但这需要创建第三个项目。
我仍在寻找一种能够只使用两个项目并将它们构建为 .exe 的方法
我正在尝试为我的技能添加一些缺失的技能,其中之一是设置适当的并行测试项目。
我在一个项目 (EffCPP) 中有一个简单的设置来试验一些 C++ 概念,我正在尝试在另一个可以访问所有相关文件和的项目中设置一个 Google 测试项目(测试)测试它们。
不幸的是,在成功设置测试项目后,我开始在 Test 中从 EffCPP 项目构建数据时遇到问题。
具体来说,一个 linker 错误表明我的测试项目不能 link public 构造函数访问的私有静态方法。
我确信我在这里遗漏了一些关于编译过程的东西,但解决方案似乎并不明显,而且查询本身很难 google。
我有一个 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 但这只是建议我设置第三个项目作为库构建,然后 link 那个静态库。这是唯一的方法吗?
此问题的一个可能解决方案是不从 EffCPP
项目创建可执行文件,而是创建一个静态库。
这个静态库可以很容易地提供给测试项目,然后可以 link 它和 运行 本身作为一个 exe。
在此 question 中可以找到另一种可能的解决方案,但这需要创建第三个项目。
我仍在寻找一种能够只使用两个项目并将它们构建为 .exe 的方法