如何使用 gmock 测试类是否调用其基类的方法

2024-03-06

class Foo {
public:
    int x;
    int y;

    void move(void);
};

class SuperFoo: public Foo {
public:
    int age;

    void update();
};

SuperFoo::update(void) {
    move();
    age++;
}

我刚刚开始使用 C++ 和单元测试,我有一些类似于上面的代码,我想使用 gmock 来测试它SuperFoo::update()调用基类'move()方法。应对这种情况的最佳方法是什么?


一种方法是使move方法 virtual,并创建类的模拟:

#include "gtest/gtest.h"
#include "gmock/gmock.h"

class Foo {
public:
    int x;
    int y;

    virtual void move(void);
    //^^^^ following works for virtual methods
};
// ...

class TestableSuperFoo : public SuperFoo
{
public:
  TestableSuperFoo();

  MOCK_METHOD0(move, void ());

  void doMove()
  {
    SuperFoo::move();
  }
};

然后在您的测试中,设置相应的呼叫期望

TEST(SuperFoo, TestUpdate)
{
  TestableSuperFoo instance;

  // Setup expectations:
  // 1) number of times (Times(AtLeast(1)), or Times(1), or ...
  // 2) behavior: calling base class "move" (not just mock's) if "move" 
  //    has side-effects required by "update"
  EXPECT_CALL(instance, move()).Times(testing::AtLeast(1))
    .WillRepeatedly(testing::InvokeWithoutArgs(&instance, &TestableSuperFoo::doMove));

  const int someValue = 42;
  instance.age = someValue;
  // Act
  instance.update();
  // Assert
  EXPECT_EQ(someValue+1, instance.age);
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何使用 gmock 测试类是否调用其基类的方法 的相关文章

  • 从 C# 调用非托管 dll。拿2

    我编写了一个 C 程序 它调用一个 C DLL 将命令行参数回显到文件中 当使用 rundll32 命令调用 c 时 它显示命令行参数没有问题 但是当从 c 内部调用它时 它不会显示 我问了这个问题 https stackoverflow
  • 如何拦截 .Net 中第三方库对非虚拟方法的调用?

    我认为我需要的是 net 人们称之为 透明动态代理 的东西 但到目前为止我所看到的所有实现 Castle DynamicProxy Spring NET AOP 等 都要求我至少执行以下操作之一 将拦截的方法声明为虚拟方法 包装类并创建包装
  • 自定义可视化 Web 部件属性 sharepoint

    我在 Visual Studio 2012 中创建可视 Web 部件属性时遇到问题 我被提及http msdn microsoft com en us library ee231551 aspx http msdn microsoft co
  • 加权 Voronoi 的 CGAL 2D APOLLONIUS 图 - 如何生成和获取面和顶点?

    我正在尝试根据阿波罗尼乌斯图生成加权沃罗诺伊 我正在使用 CGAL 库 我找不到如何从 apollonius 获取面和顶点的好例子 我有以下类型定义 typedef double NT typedef CGAL Cartesian lt N
  • 多个源文件中包含包含“const”的头文件

    Why does not包含定义的头文件const并被多个源文件包含会产生编译错误multiple definition const in header file h const int num 5 int x Error Multiple
  • 如何以编程方式确定 C 中 int 数据的最大和最小限制?

    我正在尝试 K R 的练习 2 1 练习内容如下 编写一个程序来确定范围char short int and long变量 两者signed and unsigned 通过从标准标题打印适当的值并通过直接计算 如果计算它们会更困难 确定各种
  • ApiController 操作无法从查询字符串解析数组

    使用 Visual Studio 2012 2 MVC4 Web 应用程序 我有请求发送到我的 ApiController 如下所示 http localhost api keys ids 1 ids 2 ids 3 我的印象是以下方法应该
  • 无法使用 ASP.NET Core 从 JWT 令牌获取声明

    我正在尝试使用 ASP NET Core 实现 JWT 持有者身份验证的非常简单的实现 我从控制器返回的响应有点像这样 var identity new ClaimsIdentity identity AddClaim new Claim
  • WIX 自动生成 GUID *?

    假设我生成产品 ID 为 的 WIX XML 文件 另外 对于每个组件 GUID 我都使用
  • 尝试将元素推入向量

    在头文件 我没有编写 中 已经定义了一个结构体 如下所示 struct MemoryMessage public boost counted base public FastAlloc explicit MemoryMessage Memo
  • 使用 Thread.Sleep() 时,异步编程如何与线程一起工作?

    假设 前言 在之前的问题中 我们注意到Thread Sleep阻塞线程参见 什么时候使用Task Delay 什么时候使用Thread Sleep https stackoverflow com questions 20082221 whe
  • 从空白启动时 VSTO 功能区不显示解决方案

    如果我从 文件 新建项目 菜单创建一个新的 Excel 2013 和 2016 VSTO 加载项 项目 然后单击 项目 添加新项目 gt 功能区 可视化设计器 则一切正常 我启动了应用程序 我的功能区显示在 Excel 中 但是 如果我首先
  • 我应该使用函数还是无状态函子?

    这两段代码做同样的事情 如您所见 它将用于排序函数 哪个更好 我通常写后一种 但我看到一些程序员像以前那样做 struct val lessthan binary function
  • Xamarin 无法从异步获取实例

    我编写了一个通过蓝牙连接到 ESP32 的 Xamarin Forms 应用程序 现在我想从 MainPage xaml 页面的 CustomControl JoystickControl 获取值 我已经这样尝试过了 MainPage xa
  • 让 WIX 在项目中包含引用

    我对 WiX 和设置自定义安装程序完全陌生 所以我对问题的主题表示歉意 我有一个内部业务应用程序 日记 它构建并运行良好 因此我按照教程 官方文档添加 WiX 项目并引用日记的 csproj 然后构建并运行这个最基本版本的 WiX 安装程序
  • 允许 .NET WebApi 忽略 DOCTYPE 声明

    我正在尝试通过 WebApi 方法将 XML 反序列化为对象 我有以下课程 XmlRoot IsNullable false public class MyObject XmlElement Name public string Name
  • 无论表单上的焦点控件如何,如何捕获 Keys.F1?

    我使用了 KeyDown 事件和一些简单的代码 例如if e KeyCode Keys F1 捕获在表单上按下 F1 但如果表单上有一些文本框 或者表单上有一些带有 Dock Fill 的电子表格 则上面的代码将毫无用处并且不执行任何操作
  • 父窗体中的居中消息框[重复]

    这个问题在这里已经有答案了 有没有一种简单的方法可以在 net 2 0中将MessageBox居中于父窗体中 我在 C 中确实需要这个并发现中心消息框 C http bytes com topic c sharp answers 26712
  • 如何并排显示 4 个三角形图案

    我无法让 4 个不同的三角形图案并排出现 这是一个控制台应用程序 这正是我试图通过使用嵌套 for 循环来实现的目标
  • 当另一个进程使用 std::fstream 写入文件时从文件读取[重复]

    这个问题在这里已经有答案了 我需要从文件中逐行读取 它是由 std getline 完成的 另一个进程的问题是一直向其附加数据 然后我需要读取新行 例如 文件一开始包含10行 我的程序读取了10行 那么我的程序应该等待 过了一会儿 另一个进

随机推荐

  • (int (*)[])var1 代表什么?

    我找到了这个示例代码 我尝试用谷歌搜索什么 int var1可以代表 但我没有得到有用的结果 include
  • 将直方图的条形以标签为中心对齐

    出于布局原因 我想将直方图条放置在标签的中心 这样条的中间位于标签的顶部 library ggplot2 df lt data frame x c 0 0 1 2 2 2 ggplot df aes x geom histogram bin
  • 我如何获取字节数组的前“n”个元素并将它们直接转换为字符串?

    我有一个由 1024 个元素组成的字节数组 我想将其分解为不同的字符串私有成员 例如 前 9 个字节用于名称 接下来的 12 个字节用于用户 ID 等 无需将整个字节数组转换为字符串 然后使用子字符串方法 有什么方法可以将数组中的一系列字节
  • 暂停反应本机博览会音频?

    我运行音频没有问题 但暂停它时遇到问题 如果有人可以提供帮助那就太好了 async function playMusic const soundObject new Audio Sound console log Being hit try
  • “参数类型‘C’可能不会存在足够长的时间”,当它不需要时

    我正在用 Rust 编写非常基本的人工智能系统 其主要组成部分有 Actions 可以由库用户实现 用于特定用途 Generic Context 它被传递给所有动作 并且只需要在动作执行期间存在 ActionsContainer 它 全局
  • Java 中的基数参数是什么?它是如何工作的?

    我理解该函数的基数Integer parseInt 是将字符串转换成的基数 用基数 基数 16 转换的 11 基数 10 不应该是B代替17 下面的代码根据课本打印17 public class Test public static voi
  • iOS显示tableview标题图像(视差效果)

    我正在尝试设置一个大图像 随着表格视图进一步拉低 可以显示更多信息 我知道我没有任何意义 它更容易显示我从 netbot 记录的一个例子 http vine co v bdKrALdOheD 请让我知道正确的术语是什么 我将更新标题 Upd
  • Task.perform 期望第三个参数是不同的类型

    我正在尝试将 Elm 教程改编为我自己的小项目 但我在使用我提供的 Json Decoder 时遇到了麻烦 我的代码如下所示 type Msg RetrieveComments FetchSucceed String FetchFail H
  • Hibernate:多个结果集

    从我在 Hibernate 文档 在线中读到的内容来看 听起来 Hibernate 没有处理多个结果集的能力 我希望在依赖 Hibernate 的应用程序中进行 MySQL DB 调用 这将返回多个结果集 您使用过哪些解决方案可以与 Hib
  • Eclipse 不会将 jar 部署到 WEB-INF/lib 目录中

    为了将 JSF 与 Spring 集成 我在中添加了这些行web xml
  • 使用 prometheus 和 grafana 跟踪事件

    有一篇文章 跟踪每个版本 https codeascraft com 2010 12 08 track every release 它讲述了如何在每个代码部署的图表上显示一条垂直线 他们正在使用石墨 我想用 Prometheus 2 2 和
  • OpenCV 从 BGR 颜色转换为灰度时出错

    我正在尝试使用以下代码将图像从 BGR 转换为灰度格式 img cv2 imread path to image file gray cv2 cvtColor img cv2 COLOR BGR2GRAY 这似乎工作正常 我检查了数据类型i
  • 没有 php.ini 与brew

    我用brew安装了PHP7 它说 The php ini file can be found in usr local etc php 7 0 php ini 但我在那里什么也没看到 所以我确认了php fpm i Configuratio
  • 嵌入、嵌入高级或动态地图之间的区别

    我正在使用 Google Maps Javascript API 将地图添加到网站 现在 当谷歌改变他们的价格时 我不确定我的极限是多少 这site https cloud google com maps platform pricing
  • 如何刷新 DbContext

    我想刷新我的所有实体DbContext在没有重新创建它的情况下 我尝试了以下操作 但没有一个有意义 var context IObjectContextAdapter myDbContext ObjectContext var refres
  • 在 Windows 上构建 Boost

    我正在尝试使用 mingw 在 Windows 7 x64 机器上构建 boost 库 当我尝试运行 b2 时 b2 build dir C boost build toolset gcc with python 构建库时出现错误 Jamr
  • C# 在包含任何字符的设置中序列化 List 的方法 (Regex/xml)

    我正在寻找一种简洁 干净的方法将字符串列表存储到C 设置 http msdn microsoft com en us library aa730869 28VS 80 29 aspx文件 据我所知 您无法将 List 对象存储到这些设置中
  • SQL Server 2005中的连接错误

    我有一个问题 我运行应用程序 C 并收到错误 与网络相关或 发生特定于实例的错误 建立与 SQL 的连接 服务器 找不到服务器或 无法访问 验证 实例名称正确且 SQL 服务器配置为允许远程 连接 提供商 SQL 网络 接口 错误 26 错
  • 如何将 iMessage 扩展的 sqlite 存储文件下载到 MacBook

    我们正在开发 iMessage 扩展 它成功地使用了核心数据 我们需要评估 store sqlite 文件 但找不到它 我们尝试这样找到它 在 Xcode 中 窗口 gt 设备 In Installed Apps 选择我们的扩展 Downl
  • 如何使用 gmock 测试类是否调用其基类的方法

    class Foo public int x int y void move void class SuperFoo public Foo public int age void update SuperFoo update void mo