为单元测试调用继承 class 的私有成员
Calling private member of inherited class for unittest
我正在尝试编写单元测试,但 运行 遇到了一些问题。
我有一个 class,它有一个 int 来跟踪当前状态。所有继承此 class 的 classes 都可以通过调用 protectedFunction 来改变状态。
class RandomClass
{
public:
RandomClass()
{
mState = 0;
}
protected:
void protectedFunction()
{
++mState;
}
private:
int mState;
friend void UNITTEST_setMState(int state);
friend int UNITTEST_getMState();
};
现在我想为此写一个单元测试class。所以我创建了一个新的class,它继承了之前的class。为了正确测试所有状态,我需要设置状态,并且需要获取状态来断言它。我试过使用友元函数,但似乎不起作用。
class UnittestRandomClass : public RandomClass
{
public:
void wrapperProtectedFunction()
{
protectedFunction();
}
void UNITTEST_setMState(int state)
{
this->mState = state; // Apparently not like this
}
int UNITTEST_getMState()
{
return this->mState; // Apparently not like this
}
};
int main() {
UnittestRandomClass ut;
ut.UNITTEST_setMState(1);
ut.wrapperProtectedFunction();
int res = ut.UNITTEST_getMState();
ASSERT_EQ(res, 2);
}
我似乎做错了什么,因为 mState 似乎仍然是私有的,因此我遇到了无法访问的错误。我也试过直接通过返回 mState 来调用它,但同样的错误适用。
一个解决方案是将 mState 移至受保护状态,但由于还有其他 classes 继承了 RandomClass,我认为这不是一个保存解决方案。
那么我怎样才能解决这样的问题并解决我的错误呢?
对于未来的观众,这里是工作代码:
class RandomClass
{
public:
RandomClass()
{
mState = 0;
}
void publicFunction();
protected:
void protectedFunction()
{
++mState;
}
private:
int mState;
friend class UnittestRandomClass;
};
class UnittestRandomClass : public RandomClass
{
public:
void wrapperProtectedFunction()
{
protectedFunction();
}
void setMState(int state)
{
mState = state;
}
int getMState()
{
return mState;
}
};
int main() {
UnittestRandomClass ut;
ut.setMState(1);
ut.wrapperProtectedFunction();
int res = ut.getMState();
ASSERT_EQ(res, 2);
}
您的 class 声明了一个独立的函数作为友元。
你的单元测试使用了class的成员函数,class没有被声明为friend。
你可以写friend class UnitTestRandomClass;
具体你要做什么,做一个future derived的成员函数class朋友,标准没有提供。没有语法。
我正在尝试编写单元测试,但 运行 遇到了一些问题。
我有一个 class,它有一个 int 来跟踪当前状态。所有继承此 class 的 classes 都可以通过调用 protectedFunction 来改变状态。
class RandomClass
{
public:
RandomClass()
{
mState = 0;
}
protected:
void protectedFunction()
{
++mState;
}
private:
int mState;
friend void UNITTEST_setMState(int state);
friend int UNITTEST_getMState();
};
现在我想为此写一个单元测试class。所以我创建了一个新的class,它继承了之前的class。为了正确测试所有状态,我需要设置状态,并且需要获取状态来断言它。我试过使用友元函数,但似乎不起作用。
class UnittestRandomClass : public RandomClass
{
public:
void wrapperProtectedFunction()
{
protectedFunction();
}
void UNITTEST_setMState(int state)
{
this->mState = state; // Apparently not like this
}
int UNITTEST_getMState()
{
return this->mState; // Apparently not like this
}
};
int main() {
UnittestRandomClass ut;
ut.UNITTEST_setMState(1);
ut.wrapperProtectedFunction();
int res = ut.UNITTEST_getMState();
ASSERT_EQ(res, 2);
}
我似乎做错了什么,因为 mState 似乎仍然是私有的,因此我遇到了无法访问的错误。我也试过直接通过返回 mState 来调用它,但同样的错误适用。
一个解决方案是将 mState 移至受保护状态,但由于还有其他 classes 继承了 RandomClass,我认为这不是一个保存解决方案。
那么我怎样才能解决这样的问题并解决我的错误呢?
对于未来的观众,这里是工作代码:
class RandomClass
{
public:
RandomClass()
{
mState = 0;
}
void publicFunction();
protected:
void protectedFunction()
{
++mState;
}
private:
int mState;
friend class UnittestRandomClass;
};
class UnittestRandomClass : public RandomClass
{
public:
void wrapperProtectedFunction()
{
protectedFunction();
}
void setMState(int state)
{
mState = state;
}
int getMState()
{
return mState;
}
};
int main() {
UnittestRandomClass ut;
ut.setMState(1);
ut.wrapperProtectedFunction();
int res = ut.getMState();
ASSERT_EQ(res, 2);
}
您的 class 声明了一个独立的函数作为友元。
你的单元测试使用了class的成员函数,class没有被声明为friend。
你可以写friend class UnitTestRandomClass;
具体你要做什么,做一个future derived的成员函数class朋友,标准没有提供。没有语法。