【问题标题】:Calling private member of inherited class for unittest为单元测试调用继承类的私有成员
【发布时间】: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_setMStateUnittestRandomClass 的成员函数,不是RandomClass 的朋友。您可以转发声明您的 UnittestRandomClass 类并使整个类成为 friendRandomClass

标签: c++ unit-testing inheritance friend


【解决方案1】:

你的类声明一个独立的函数为友元。

你的单元测试使用了一个类的成员函数,这个类没有被声明为友元。

你可以写friend class UnitTestRandomClass;

具体来说,您想要做的是,使未来派生类的成员函数成为标准未提供的朋友。没有语法。

【讨论】:

    猜你喜欢
    • 2013-02-12
    • 2013-08-30
    • 2020-09-04
    • 2020-09-01
    • 2018-05-11
    • 2011-09-26
    • 1970-01-01
    • 2013-10-23
    相关资源
    最近更新 更多