C++ Google 测试在 Ubuntu 对 Notification 对象多次调用 Notify() 时中止

C++ Google test aborts on Ubuntu calling Notify() multiple times on Notification object

我使用 google 测试和 google 模拟。 有一个模拟对象,我希望它有一个方法调用 OnConnectionError() 通知 absl::Notification 对象 done 3 次。

  absl::Notification done;
  EXPECT_CALL(*client, OnConnectionError(::testing::_)).Times(3)
    .WillRepeatedly(Notify(&done));

  bool result = client->ConnectToServer("localhost", 5000, 2);

  done.WaitForNotificationWithTimeout(absl::Duration(absl::Seconds(30)));

方法 client->ConnectToServer 有一个循环,导致 OnConnectionError 的重复调用,这是完全正确的,也是预期的行为。

在 Windows 上,单元测试顺利通过。当 jenkins 运行 在 ubuntu 上使用它时,它会中止整个测试 运行(不仅没有通过一个测试!!),并输出以下内容。

[notification.cc : 32] RAW: Notify() method called more than once for Notification object 0x7ffffde87320

是否不允许多次调用Notification对象?为什么测试在 Windows 上成功并在 ubuntu 上中止?

非常感谢您的支持!

我自己找到了答案: 我查看了 google 绳降的相关来源。在 notification.cc 中,我找到了相关的错误消息。各自的源代码部分被一个

包围
#ifndef NDEBUG

我编辑了 CMakeLists 文件,以便通过添加行 set(CMAKE_BUILD_TYPE Release) 在 Release 模式下重建它,所以 NDEBUG 标志是在编译时定义的。

因此与这个问题没有直接关系,我以某种方式重构了被测代码,以避免循环,多次通知 absl::Notification 对象,因为这个问题告诉我有改进代码的需求。