【发布时间】:2021-03-19 22:31:59
【问题描述】:
我正在尝试编写单元测试,但遇到了一些问题。
我有一个类,它有一个 int 来跟踪当前状态。该类继承的所有类都可以通过调用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 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 移至受保护,但由于还有其他类继承了 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);
}
【问题讨论】:
-
friend void UNITTEST_setMState声明了一个免费功能,它是RandomClass的朋友。UnittestRandomClass::UNITTEST_setMState是UnittestRandomClass的成员函数,不是RandomClass的朋友。您可以转发声明您的UnittestRandomClass类并使整个类成为friend的RandomClass。
标签: c++ unit-testing inheritance friend