c++ - 如何使用成员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 代码中添加朋友等,因为我希望它尽可能原始
解决方案
你没有。你做的事情和你的实际程序一样,就是提供一个输入,然后检查结果;你说没有输出,但一定有效果,否则上课就没意义了!
如果做不到这一点,你可以让测试成为类的“朋友”,这样它就可以检查它的内部,或者为当前状态添加一个不可变的 getter(谁真的在乎你的类的用户是否能看到呢?)但是这两个选项都没有真是精神上的东西。
根据我的经验,您有时会意识到您不再是真正的单元测试,而是功能测试,而 Google Test 可能不是该工作的正确工具。如果您的班级和听起来一样大,那么这里可能就是这种情况。相反,您可以通过将类拆分成更小的块来帮助自己,然后对这些. 真的,取决于你要做什么。
推荐阅读
- macos - 如何通过终端或 M1 MacBook 上的 Apple API 获取 CPU 温度或风扇速度?
- r - RDCOMClient Outlook 在 R 中添加提醒
- node.js - “http”模块的“IncomingMessage”中未定义的“url”属性是什么意思?
- android - 如何使用资源字符串与占位符连接?
- ruby-on-rails - 我怎样才能只查询graphql中的必填字段?
- javascript - 对象中定义的函数对此有不同的实现,但普通函数有不同的原因?
- node.js - Typescript:使用 require 和 import 同步/异步
- postgresql - 创建 GinIndex 后在 django 中运行测试失败,ProgrammingError: 关系“table_name_GeoLocation_id”已经存在
- python - pandas extract() 返回空数据框
- sails.js - 查询 PostgreSQL 数据库时出现连接名称错误