为单元测试调用继承 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朋友,标准没有提供。没有语法。