GoogleMock:如何精确预期具有特定参数的一次调用,并查看失败诊断?

2024-01-13

也许是一个技巧问题,我的问题是,如果我写:

EXPECT_CALL(mock, handleMessage(_)).Times(0);                           // expectation #1
EXPECT_CALL(mock, handleMessage(Pointee(IsLike(aSpecificMessage))));    // expectation #2

...和方法handleMessage被调用一次,但有不同的参数(不是aSpecificMessage),那么失败看起来像:

Mock function called more times than expected - returning default value.
    Function call: handleMessage(0x8b5378)
          Returns: false
         Expected: to be never called
           Actual: called once - over-saturated and active

Google Mock 不会打印有关为什么参数与期望 #2 中的谓词不匹配的诊断信息。 这大概是因为期望 #1 是第一个失败的(?)。

如果我省略期望#1,那么失败就会很冗长,大致如下:

Google Mock tried the following 1 expectation, but it didn't match:

../../test/Test.cpp:143: EXPECT_CALL(mock, handleMessage(Pointee(IsLike(aSpecificMessage))))...
  Expected arg #0: points to a value that <....>
           Actual: 0xfeaf18, which points to <.....>

我正在使用自定义匹配器IsLike我经历了生成非常明确的不匹配原因的麻烦,我希望将它们打印出来。我也不想放弃期望#1,因为它位于“默认”部分,并且默认情况下我不希望在其余测试中调用该模拟。


看起来你应该使用the StrictMock模板修饰符 https://github.com/google/googletest/blob/master/googlemock/docs/CookBook.md#the-nice-the-strict-and-the-naggy。让我们使用这个简单的类和模拟:

struct Foo
{
    virtual void function(int) {
    }
};

struct MockFoo: public Foo
{
    MOCK_METHOD1(function, void(int x));
};

让我们从练习该方法的基本测试开始:

TEST(MockTest, basic_one_expectation)
{
    MockFoo foo;
    EXPECT_CALL(foo, function(4));
    Foo& foo1(foo);
    foo1.function(3);
}

Output:



[ RUN      ] MockTest.basic_one_expectation
unknown file: Failure

Unexpected mock function call - returning directly.
    Function call: function(3)
Google Mock tried the following 1 expectation, but it didn't match:

mock-test.cpp:298: EXPECT_CALL(foo, function(4))...
  Expected arg #0: is equal to 4
           Actual: 3
         Expected: to be called once
           Actual: never called - unsatisfied and active
mock-test.cpp:298: Failure
Actual function call count doesn't match EXPECT_CALL(foo, function(4))...
         Expected: to be called once
           Actual: never called - unsatisfied and active
[  FAILED  ] MockTest.basic_one_expectation (1 ms)
  

这是您已经考虑过的替代方案之一,但您不想要它,因为您还有其他测试,这些测试对函数是否被调用没有任何特定期望,并且您希望这些测试在函数被调用时失败反正。提醒一下,让我们看看尝试这样的测试时发生了什么:

TEST(MockTest, basic_no_expectation)
{
    MockFoo foo;
    Foo& foo1(foo);
    foo1.function(3);
}

Output:



[ RUN      ] MockTest.basic_no_expectation

GMOCK WARNING:
Uninteresting mock function call - returning directly.
    Function call: function(3)
Stack trace:
[       OK ] MockTest.basic_no_expectation (1 ms)
  

我们收到警告,但测试仍然通过。这对你没有好处。我们来看看有什么效果StrictMock has:

TEST(MockTest, strict_no_expectation)
{
    ::testing::StrictMock<MockFoo> foo;
    Foo& foo1(foo);
    foo1.function(3);
}

Output:



[ RUN      ] MockTest.strict_no_expectation
unknown file: Failure
Uninteresting mock function call - returning directly.
    Function call: function(3)
[  FAILED  ] MockTest.strict_no_expectation (0 ms)
  

我们不必明确表示我们不希望调用该函数,但是当无论如何调用该函数时,测试都会失败。正是您想要的。

最后,让我们看看会发生什么StrictMock在有的情况下are对函数参数的明确期望:

TEST(MockTest, strict_one_expectation)
{
    ::testing::StrictMock<MockFoo> foo;
    EXPECT_CALL(foo, function(4));
    Foo& foo1(foo);
    foo1.function(3);
}

Output:



[ RUN      ] MockTest.strict_one_expectation
unknown file: Failure

Unexpected mock function call - returning directly.
    Function call: function(3)
Google Mock tried the following 1 expectation, but it didn't match:

mock-test.cpp:307: EXPECT_CALL(foo, function(4))...
  Expected arg #0: is equal to 4
           Actual: 3
         Expected: to be called once
           Actual: never called - unsatisfied and active
mock-test.cpp:307: Failure
Actual function call count doesn't match EXPECT_CALL(foo, function(4))...
         Expected: to be called once
           Actual: never called - unsatisfied and active
[  FAILED  ] MockTest.strict_one_expectation (0 ms)
  

诊断显示参数不匹配的原因,就像原来的一样basic_one_expectation测试如上所示。

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

GoogleMock:如何精确预期具有特定参数的一次调用,并查看失败诊断? 的相关文章

  • 从 SQL 数据库获取日期时间

    我的数据库表中有一个 DateTime 记录 我编写一个查询从数据库中获取它 string command2 select Last Modified from Company Data where Company Name Descrip
  • Web UI 中的 .Result 出现死锁

    我正在阅读以下主题http blog stephencleary com 2012 07 dont block on async code html http blog stephencleary com 2012 07 dont bloc
  • 如何知道并加载特定文件夹中的所有图像?

    我有一个应用程序 C Builder 6 0 需要知道特定文件夹中的图像总数 然后我必须加载它们 在 ImageList 或 ComboBoxEx 中 或任何其他控件中 我怎样才能做到这一点 我知道如何在控件中加载图像 或保存在 TList
  • 如何向 UWP 项目添加 .NET dll 引用?

    我有几个适用于 NETv4 x 的 NET dll 项目 我将版本更改为 4 6 1 并重新构建 没有出现问题 当我尝试从 UWP 项目向它们添加引用时 出现错误 项目的目标是 NETCore 而文件引用的目标是 NET框架 这不是受支持的
  • 将 2D 数组映射到 1D 数组

    我想用一维数组来表示一个二维数组 函数将传递两个索引 x y 和要存储的值 这两个索引代表一维数组的单个元素 并相应地设置它 我知道一维数组需要具有 arrayWidth arrayHeight 的大小 但我不知道如何设置每个元素 例如 如
  • 测试 hdf5/c++ 中的组是否存在

    我正在打开一个现有的 HDF5 文件来附加数据 我想向那个叫做的小组保证 A存在以供后续访问 我正在寻找一种简单的方法来创建 A有条件地 如果不存在则创建并返回新组 或者返回现有组 一种方法是测试 A存在 我怎样才能高效地做到这一点 根据
  • .NET 可移植类库中的 .ToShortDateString 发生了什么

    我想知道为什么没有 ToShortDateString在 NET 可移植类库中 我有 2 个项目 Silverlight 和常规 NET 类库 使用相同的代码 并且代码涉及调用 ToShortDateString on a DateTime
  • 有没有比这更快的方法来查找目录和所有子目录中的所有文件?

    我正在编写一个程序 需要在目录及其所有子目录中搜索具有特定扩展名的文件 这将在本地驱动器和网络驱动器上使用 因此性能是一个问题 这是我现在使用的递归方法 private void GetFileList string fileSearchP
  • 对数字进行向上和向下舍入 C++

    我试图让我的程序分别向上和向下舍入数字 例如 如果数字是3 6 我的程序应该四舍五入最接近的数字 4 如果该数字是3 4 它将向下舍入为 3 我尝试使用ceil库获取 3 个项目的平均值 results ceil marks1 marks2
  • 组合 Datepicker 和 Timepicker 值 Win 8.1

    我试图同时使用 Datepicker Timepicker 来返回可以存储在数据库中的 DateTime 例如 我想要安排会议的开始日期和结束日期 如果适用 我将如何将这些值组合成 SQL 数据库可以处理的正确格式 任何反馈都会很棒 我让这
  • 控制台应用程序 .net Core 2.0 的配置

    在 net Core 1 中我们可以这样做 IConfiguration config new ConfigurationBuilder AddJsonFile appsettings json true true Build 这样就可以使
  • C中有const吗?

    这个问题可能很幼稚 但是 有没有constC 中的关键字 从哪个版本开始 之间有任何语义和 或句法差异吗const在 C 和 C 中 C 和 C 之间在语法上没有差异const关键字 除了一个相当晦涩的关键字 在 C 中 自 C99 起 您
  • CMake - 将预构建库链接到 C# 项目

    我正在使用 CMake 构建 C 库 该库依赖于已构建的库 dll 我似乎无法让图书馆链接到我的图书馆 我尝试过使用target link libraries mylib external lib 我也尝试过暴力破解 reference e
  • 推送 Lua 表

    我已经创建了一个Lua表C 但我不知道如何将该表推入堆栈顶部 以便我可以将其传递给 Lua 函数 有谁知道如何做到这一点 这是我当前的代码 lua createtable state libraries size 0 int table i
  • _mm_max_ss 在 clang 和 gcc 之间有不同的行为

    我正在尝试使用 clang 和 gcc 交叉编译一个项目 但在使用时发现一些奇怪的差异 mm max ss e g m128 a mm set ss std numeric limits
  • C# ToString("MM/dd/yy") 删除前导 0 [重复]

    这个问题在这里已经有答案了 可能的重复 格式化 NET DateTime Day 不带前导零 https stackoverflow com questions 988353 format net datetime day with no
  • 在 MVVM 中,可以在视图后面的代码中访问 ViewModel 吗?

    在 MVVM 模式中 是否可以接受甚至可以访问视图代码后面的 ViewModel 属性 我有一个可观察的集合 它填充在 ViewModel 中 我需要在视图中使用它来绑定到带有链接列表的无限滚动条 IE private LinkedList
  • C# - 为什么我需要初始化 [Out] 参数

    我有几个从本机 dll 导入的方法 使用以下语法 internal static class DllClass DllImport Example dll EntryPoint ExampleFunction public static e
  • 有没有办法让 VS2010 在我的方法中扩展或收缩 try 块?

    我的代码有很多 try catch finally 块 与我在 VS2010 中的方法不同 除了添加区域之外 我无法在开发时扩展或收缩这些区域来隐藏内容 try vm R vm Qu vm T vm D vm Fil vm Type vm
  • 最后从同一类中的其他构造函数调用构造函数

    我在这里读到可以调用另一个构造函数从同一类中的另一个构造函数调用构造函数 https stackoverflow com questions 829870 calling constructor from other constructor

随机推荐

  • 当子类中有重写函数时如何转换为超类

    超一流的Car和一个子类Jaguar被创建 功能信息 gt 无效在子类中重写了超类的函数 名为的实例theAuto类型的Jaguar已经被创建了 Problem 看来我不能向上投射theAuto的类型Car 请查看代码片段及其注释 clas
  • 在pythonplotly包中操作散点图中的图例

    我想使用 python 中的plotly 和特定标记颜色来绘制散点图 但当我成功做到这一点时 图例并不对应 现在 图例中的所有标签都具有相同的颜色 蓝色 我想要图例代表risks从我的数据中 颜色与代码中提到的相同 像这样 蓝色标记 中等低
  • jQuery:获取 jQuery 中隐藏元素的高度

    我需要获取隐藏 div 内元素的高度 现在我显示 div 获取高度并隐藏父 div 这似乎有点傻 有没有更好的办法 我正在使用 jQuery 1 4 2 select show optionHeight firstOption height
  • 在 iPad 中创建交互式视频 - 用于产品演示的应用程序

    我想创建需要在 iPad 本机应用程序上运行的视频 该应用程序需要通过 iPad 展示产品演示 它也需要具有互动性 我知道我们可以在 Flash 中执行这些操作 因为 iPad 不支持 Flash 我有什么选择 我很感激任何指导或提示 先感
  • 如何将 C# 中的“where”关键字与通用接口和继承一起使用

    我想要实现的是 声明一个泛型类 将 T 限制为实现 IMySpecialInterface 的类型 其中 X 不是已知类型 并让该类继承父类 举一个不正确的例子 public class MyClass
  • 层次结构查看器结果解释

    几天前 我在 Eclipse 中安装了 ADT 插件的更新 并且刚刚尝试了新的层次结构查看器工具 除了我花了一段时间才发现测量值仅在第一个 父 视图中计算之外 我还观察到每次显示的值都不相同 即使我的应用程序中没有任何更改 例如 我在模拟器
  • .NET 序列化排序

    我正在尝试使用 XmlSerializer 和继承序列化一些对象 但在排序结果时遇到一些问题 下面是一个与我设置类似的示例 public class SerializableBase XmlElement Order 1 public bo
  • C++ 从 Linux 访问 SQL Server

    我需要用 C 将一些数据从 Linux 写入 SQL Server 数据库 我找到了这个sqlapi com 但我认为 首先必须安装 ODBC 驱动程序并且必须工作 我关注了这个 adminlife net allgemein mssql
  • AVPlayer,播放/暂停状态通知?

    我正在寻找一种方法 以便在发生时准确收到通知AVPlayer开始播放 有 费率 属性 但目前我正在定期检查它NSTimer获取更新 我尝试了 KVO 但显然它不符合 KVO 标准 我知道有events https developer app
  • 使用 jquery 动态生成的列表项上的单击事件

    我有一个动态生成的列表 然后我单击该项目并传递index 到另一个函数 问题是这个列表是动态填充的 当我这样做时我的代码没有响应click事件 但是 如果我在动态填充的元素之外添加几个静态 li 元素到列表中 那么这些静态元素就可以工作 这
  • 未通过 .where() 从云函数获取结果

    我正在使用此代码通过比较从集合中获取数据 eslint disable const functions require firebase functions const admin require firebase admin admin
  • 嵌入 Flash 对象上的 HTML 包装器 div 无法通过 jQuery“点击”

    我一直在尝试按照客户的要求进行操作 一旦客户单击 swf 格式的顶部横幅 就重定向到活动页面 然后重定向到目标页面 您可以在以下位置查看已完成的操作 http ausdcf org http ausdcf org 如果您使用 Firefox
  • 在gnuplot中绘制不同颜色的区域

    我制作了以下脚本来在 gnuplot 中绘制图表 有几个点 每个点都封闭在一定的区域内 我想给每个封闭区域指定颜色 我的脚本如下 set terminal wxt set yrange 0 100 set xrange 0 100 unse
  • 检测我正在哪台计算机上运行 R 脚本

    我正在寻找一个 R 函数来返回正在运行脚本的计算机的标识符 或者至少区分两台已知计算机中的一台 我有两台 PC 均运行 Windows 和 RStudio 我通过 VPN 使用办公室的台式机和笔记本电脑 通常处理相同的项目 并且始终使用 R
  • 是否可以等到其他线程处理发布到它的输入消息?

    我想可靠地模拟用户输入到其他窗口 我用SendInput为此 但我需要等到目标应用程序处理输入后再发送更多内容 据我所知 SendInput尽管它的名字如此 但它实际上将消息发布到队列中 并且不会等到它们被处理 我的尝试是基于等待消息队列至
  • jQuery:使用退出按钮退出全屏模式时如何执行代码?

    以下问题 使用我的代码 我通过单击列表中的图像进入全屏模式 我通过 jQuery 将下一个按钮和上一个按钮移动到屏幕边缘 但离开全屏模式后 我希望它们回到原来的位置 但是如何检测全屏模式是否被取消呢 这是我的代码 HTML div span
  • C++ 标准是否保证“a”“b”合并为“ab”? [复制]

    这个问题在这里已经有答案了 下面的代码是cpp标准吗 我以前见过它并且效果很好 但是 我不确定这个标准是否已经存在 include
  • 增强 java.util.Date 类时,cglib 抛出 IllegalArgumentException

    我正在努力增强java util Date与cglib 它不起作用 而且我对 cglib 没有经验 所以我想知道出了什么问题 例如 下面的代码增强了ArrayList works Test public void enhance Array
  • 合并 data.frame 但只保留唯一的列?

    假设我想合并两个 data frames 但有些列是多余的 相同 我如何合并这些 data frames 但删除冗余列 X1 data frame id c a b c same c 1 2 3 different1 c 4 5 6 X2
  • GoogleMock:如何精确预期具有特定参数的一次调用,并查看失败诊断?

    也许是一个技巧问题 我的问题是 如果我写 EXPECT CALL mock handleMessage Times 0 expectation 1 EXPECT CALL mock handleMessage Pointee IsLike