首页 > 解决方案 > 如何使用成员c ++使用gtest测试基于私有类的行为

问题描述

我想使用 Google 测试来测试我的课程。假设我有一个状态机实现,并且当前状态是私有的,所以我有一个方法 SetNextState,它看起来像这样:

void setNextState
{
  switch(m_currentState) //m_currentState is a private member
  {
    case INIT_STATE:
    {
       if some conditions occurred m_currentState=GO_STATE
    } 
......
  }
}

所以我有几个案例,每个案例都定义了从某个状态移动到另一个状态的行为。我的问题:假设状态仅与此类相关,因此没有输出,我如何对该方法执行测试我如何将其值设置为,例如“GO_STATE”以测试 GO_STATE 情况以及如何检查测试结束时的 m_currentState 我试图避免在我的 UUT 代码中添加朋友等,因为我希望它尽可能原始

标签: c++googletest

解决方案


你没有。你做的事情和你的实际程序一样,就是提供一个输入,然后检查结果;你说没有输出,但一定效果,否则上课就没意义了!

如果做不到这一点,你可以让测试成为类的“朋友”,这样它就可以检查它的内部,或者为当前状态添加一个不可变的 getter(谁真的在乎你的类的用户是否能看到呢?)但是这两个选项都没有真是精神上的东西。

根据我的经验,您有时会意识到您不再是真正的单元测试,而是功能测试,而 Google Test 可能不是该工作的正确工具。如果您的班级和听起来一样大,那么这里可能就是这种情况。相反,您可以通过将类拆分成更小的块来帮助自己,然后对这些. 真的,取决于你要做什么。


推荐阅读