0

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

  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 上中止?

非常感谢您的支持!

4

1 回答 1

0

我自己找到了答案:我查看了google abseil的相关来源。在 notification.cc 我找到了相关的错误信息。相应的源部分被包围

#ifndef NDEBUG

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

由于与这个问题没有直接关系,我以某种方式重构了被测代码,以避免循环多次通知 absl::Notification 对象,因为这个问题表明我需要改进代码.

于 2020-11-30T07:21:43.813 回答