如何使用 gtest 对 std::bind 函数进行单元测试?

2024-04-15

我正在尝试为项目中的一些 cpp 文件编写单元测试用例。

这里的场景是: 我有一个 cpp 文件,只定义了一个公共方法,然后又调用私有方法。

这里私有方法在公共方法中作为回调方法被调用。我如何在这里测试私有方法。我将对回调指针进行模拟,但我不知道如何调用私有方法。

请给我一些建议,如何在这种情况下调用私有方法而不更改源代码。

这是前:

buttonListenerList <<
 sourceButton->addButtonActionCallback(std::bind(&AudioSource::buttonCallback, this, _1, _2));

这种和平的代码是在公共方法中定义的。现在AudioSource::buttonCallback是一个私有方法。如何确保通过调用公共方法来调用这个私有方法。


如果,(您在评论中回答是)sourceButton可以被嘲笑 - 然后期待addButtonActionCallback被调用 - 并存储传递的std::function<> arg.

就像下面的示例一样(将 ... 替换为真实类型):

struct TestSuite : public ::testing::Test {
   ...  sourceButtonMock;
   std::unique_ptr<...>  objectUnderTest;
   void SetUp() override;
   std::function<...>  sourceButtonActionCallback;
};
using namespace ::testing;
void TestSuite::SetUp()
{
    EXPECT_CALL(sourceButtonMock, addButtonActionCallback(_))
          .WillOnce(SaveArg<0>(&sourceButtonActionCallback);
    objectUnderTest = std::make_unique<...>(sourceButtonMock);
}

将此回调存储在sourceButtonActionCallback成员变量 - 你可以在任何你想要的地方自由调用它:

TEST_F(TestSuite, shallDo...OnSourceButtonClick)
{
   // prerequisites
   ASSERT_NE(sourceButtonActionCallback, nullptr);

   // Expecteations
   ...

   // action
   sourceButtonActionCallback(...);

   // post-assertions
   ...
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何使用 gtest 对 std::bind 函数进行单元测试? 的相关文章

  • C 编程 - 文件 - fwrite

    我有一个关于编程和文件的问题 while current NULL if current gt Id Doctor 0 current current gt next id doc current gt Id Doctor if curre
  • 我如何才能等待多个事情

    我正在使用 C 11 和 stl 线程编写一个线程安全队列 WaitAndPop 方法当前如下所示 我希望能够将一些内容传递给 WaitAndPop 来指示调用线程是否已被要求停止 如果 WaitAndPop 等待并返回队列的元素 则应返回
  • “构建”构建我的项目,“构建解决方案”则不构建

    我刚刚开始使用VS2010 我有一个较大的解决方案 已从 VS2008 成功迁移 我已将一个名为 Test 的控制台应用程序项目添加到解决方案中 选择构建 gt 构建解决方案不编译新项目 选择构建 gt 构建测试确实构建了项目 在失败的情况
  • 为什么 C# Array.BinarySearch 这么快?

    我已经实施了一个很简单用于在整数数组中查找整数的 C 中的 binarySearch 实现 二分查找 static int binarySearch int arr int i int low 0 high arr Length 1 mid
  • WCF RIA 服务 - 加载多个实体

    我正在寻找一种模式来解决以下问题 我认为这很常见 我正在使用 WCF RIA 服务在初始加载时将多个实体返回给客户端 我希望两个实体异步加载 以免锁定 UI 并且我想利用 RIA 服务来执行此操作 我的解决方案如下 似乎有效 这种方法会遇到
  • Coffeescript + 单元测试:全局变量?

    我正在尝试使用 Jasmine 对用 CoffeeScript 编写的小型应用程序进行单元测试 我发现很多资料都说单元测试可以在从 CoffeeScript 编译的 JS 上完美地完成 如果所有内容都包装在匿名函数中以避免污染名称空间 如何
  • 在结构中使用 typedef 枚举并避免类型混合警告

    我正在使用 C99 我的编译器是 IAR Embedded workbench 但我认为这个问题对于其他一些编译器也有效 我有一个 typedef 枚举 其中包含一些项目 并且我向该新类型的结构添加了一个元素 typedef enum fo
  • 不支持将数据直接绑定到存储查询(DbSet、DbQuery、DbSqlQuery)

    正在编码视觉工作室2012并使用实体模型作为我的数据层 但是 当页面尝试加载时 上面提到的标题 我使用 Linq 语句的下拉控件往往会引发未处理的异常 下面是我的代码 using AdventureWorksEntities dw new
  • 嵌套接口:将 IDictionary> 转换为 IDictionary>?

    我认为投射一个相当简单IDictionary
  • 类模板参数推导 - clang 和 gcc 不同

    下面的代码使用 gcc 编译 但不使用 clang 编译 https godbolt org z ttqGuL template
  • BitTorrent 追踪器宣布问题

    我花了一点业余时间编写 BitTorrent 客户端 主要是出于好奇 但部分是出于提高我的 C 技能的愿望 我一直在使用理论维基 http wiki theory org BitTorrentSpecification作为我的向导 我已经建
  • 如何使用 ICU 解析汉字数字字符?

    我正在编写一个使用 ICU 来解析由汉字数字字符组成的 Unicode 字符串的函数 并希望返回该字符串的整数值 五 gt 5 三十一 gt 31 五千九百七十二 gt 5972 我将区域设置设置为 Locale getJapan 并使用
  • 转发声明和包含

    在使用库时 无论是我自己的还是外部的 都有很多带有前向声明的类 根据情况 相同的类也包含在内 当我使用某个类时 我需要知道该类使用的某些对象是前向声明的还是 include d 原因是我想知道是否应该包含两个标题还是只包含一个标题 现在我知
  • 控件的命名约定[重复]

    这个问题在这里已经有答案了 Microsoft 在其网站上提供了命名指南 here http msdn microsoft com en us library xzf533w0 VS 71 aspx 我还有 框架设计指南 一书 我找不到有关
  • 覆盖子类中的字段或属性

    我有一个抽象基类 我想声明一个字段或属性 该字段或属性在从该父类继承的每个类中具有不同的值 我想在基类中定义它 以便我可以在基类方法中引用它 例如覆盖 ToString 来表示 此对象的类型为 property field 我有三种方法可以
  • 链接器错误:已定义

    我尝试在 Microsoft Visual Studio 2012 中编译我的 Visual C 项目 使用 MFC 但出现以下错误 error LNK2005 void cdecl operator new unsigned int 2
  • cmake 将标头包含到每个源文件中

    其实我有一个简单的问题 但找不到答案 也许你可以给我指一个副本 所以 问题是 是否可以告诉 cmake 指示编译器在每个源文件的开头自动包含一些头文件 这样就不需要放置 include foo h 了 谢谢 CMake 没有针对此特定用例的
  • 如何在Xamarin中删除ViewTreeObserver?

    假设我需要获取并设置视图的高度 在 Android 中 众所周知 只有在绘制视图之后才能获取视图高度 如果您使用 Java 有很多答案 最著名的方法之一如下 取自这个答案 https stackoverflow com a 24035591
  • 哪种 C 数据类型可以表示 40 位二进制数?

    我需要表示一个40位的二进制数 应该使用哪种 C 数据类型来处理这个问题 如果您使用的是 C99 或 C11 兼容编译器 则使用int least64 t以获得最大的兼容性 或者 如果您想要无符号类型 uint least64 t 这些都定
  • 对来自流读取器的过滤数据执行小计

    编辑问题未得到解答 我有一个基于 1 个标准的过滤输出 前 3 个数字是 110 210 或 310 给出 3 个不同的组 从流阅读器控制台 问题已编辑 因为第一个答案是我给出的具体示例的字面解决方案 我使用的实际字符串长度为 450 个

随机推荐

  • 计算各自列中的关键字数量

    假设我有这样的数据 df lt read table text title date text blablabla 22 07 2023 blablablabla Blue blablabla blablabla 23 06 2023 ba
  • Swagger UI 正在将请求中的协议从 https 更改为 http

    在 swaggerUI 中 默认采用 http 但实际 API 将支持 https 一种可能的方式 将删除架构中的 http 但在本地无法测试 https 那么这个问题的可能解决方案是什么 任何人有想法请帮助我找到它 只需将其放入您的文档中
  • 更改 Java/Swing 中的助记符修饰键

    在 Swing 中设置焦点热键非常简单 tfldPlantsNeeded new JTextField FIELD LEN MED lblPlantsNeeded new JLabel Plants Needed lblPlantsNeed
  • 使用apache poi检测Excel中的隐藏单元格

    我们使用 apache poi 3 8 来解析 Excel 我们需要能够检测 并跳过 隐藏行 因为它们在我们的用例中往往包含垃圾数据 看起来这应该有效 row isFormatted row getRowStyle getHidden 但似
  • 抑制 Access VBA 中的写入冲突消息

    我的问题 我编写了一个存储过程来计算通过 Ms Access 前端 到 MSSQL2000 数据库 上的表单呈现的多个字段 我一打电话表格重新查询获取更改后的值 我可以看到我引起了写冲突的恼人消息 自您开始编辑以来 该记录已被其他用户更改
  • Fortran 指针多态性

    我正在尝试使用指针在对象之间创建链接 使用 Fortran 下面是代码片段 module base pars module type abstract public base pars end type end module module
  • Tensorflow:裁剪图像的最大中心方形区域

    我的网络拍摄尺寸的图像100 x 100像素 因此 我必须调整不同大小的数据集图像的大小 我希望能够从给定图像中提取最大的中心正方形区域 然后将其大小调整为100 x 100 更准确地说 假设图像的宽度为200像素和高度50像素 然后我想提
  • jwt:为什么我的令牌显示在 Chrome DevTools 中?

    我在 Express js 中有一个 API 可以创建博客文章并将其添加到我的数据库中 当我从 DevTools 内的 React 应用程序发出请求时 它将显示我的 JWT 我担心当我的网站上线时 人们可以看到我的令牌并从他们的网站发出添加
  • GIT 和推送忽略的文件

    使用 git 时必须遵循的具体程序是什么 我将给出我的程序 不知何故 它工作得不太顺利 cloned a repository works fine added settings files to gitignore to prevent
  • IntelliJ 结构搜索和替换问题

    有没有一种简单的方法来捕获类型 我似乎无法做一些基本的事情 例如并排使用变量表达式 例如 mapType mapEnd 做一个简单的替换 这可能有什么原因吗 也就是说 如果我有一个表达式 比如 s abc 我把它分成两个变量 s and a
  • 受密码保护的 pdf 中密码字段不可见

    我正在使用 PDF 套件框架来显示 编辑 pdf 文件 它在 macOS 10 12 上严重损坏 有时受密码保护的文件不显示密码字段 有时密码字段在普通文件中可见 我可以使用未记录的 API 来修复此问题 它的问题与隐藏 取消隐藏密码视图有
  • javax.net.ssl.SSLException:SSLSocketFactory 为 null

    我的以下代码有问题 System setProperty javax net ssl keyStoreType pkcs12 System setProperty javax net ssl trustStoreType jks Syste
  • 从核心数据中获取子项总和

    假设我有三个实体 Person 姓名 地址 对多工资 和 对多贷款 Salary 收入 税 相对 对一个人 Bills数量 相对 对一个人 如何执行获取结果如下 John Doe SUM gt 收入 SUM gt 金额 Eva Doe SU
  • ES2015 (ES6) `class` 语法有什么好处?

    我对 ES6 类有很多疑问 使用有什么好处class句法 我读到 public private static 将成为 ES7 的一部分 这是一个原因吗 而且 是class一种不同类型的 OOP 或者它仍然是 JavaScript 的原型继承
  • Android 收到新电子邮件时如何执行一些代码?

    在 Android 中 当新电子邮件 gmail 到达时 如何执行一些代码 在 Android 中 当新电子邮件 gmail 到达时 如何执行一些代码 没有记录的广播Intents当 Gmail 到达时发送出去 Gmail 不是 Andro
  • 处理单数和复数控制器/路由

    我对如何在网络应用程序中处理单数和复数路由和控制器感到有点困惑 该网站是一个简单的报价网站 想想爱因斯坦 莎士比亚等 而不是保险 在项目中 我有一个名为 QuoteController 的控制器 控制器名称是单数 那么这是否意味着控制器应该
  • 检查 csv 列中除一项之外的所有项目 [python pandas]

    我试图弄清楚如何使用 python pandas 检查整个列以验证所有值都是整数 除了一个 一行名称始终有一个浮点数 CSV 示例 name num random1 2 random2 3 random3 2 89 random4 1 ra
  • 使用 Volley android 将发布数据发送到服务器

    我正在尝试使用 Volley 库向服务器发送一些数据 private void registerUser final String email final String username final String password Tag
  • Shadow dom 内的 FontAwesome svg

    我正在尝试在 Web 组件中使用 font Awesome js svg 库 但图标不会显示 这可能吗 我正在尝试在现有的 webforms 项目中实现一个角度组件 而无需 css 和脚本 流血 关于如何做到这一点还有其他建议吗 ifram
  • 如何使用 gtest 对 std::bind 函数进行单元测试?

    我正在尝试为项目中的一些 cpp 文件编写单元测试用例 这里的场景是 我有一个 cpp 文件 只定义了一个公共方法 然后又调用私有方法 这里私有方法在公共方法中作为回调方法被调用 我如何在这里测试私有方法 我将对回调指针进行模拟 但我不知道