【问题标题】:How to use a (smart) pointer to mocked object (in google mock)如何使用(智能)指针来模拟对象(在谷歌模拟中)
【发布时间】:2019-06-27 06:07:26
【问题描述】:

当我使用shared_ptr 将我的模拟对象存储在堆上时,期望得到满足并且指针被销毁,但 GMock 框架认为模拟对象仍然存在:

// Using a mock object
MockFoo foo;
EXPECT_CALL(foo, doSomething());
foo.doSomething();
// Test passes without warnings
// Using shared_ptr to a mock object
auto foo_sp = std::make_shared<MockFoo>();
EXPECT_CALL(*foo_sp, doSomething());
A a(std::move(foo_sp));
a.useFoo();
// a is then deleted
...
// in useFoo:
foo_sp->doSomething();
...
// Test passes WITH warnings that mock object is still alive

这是 Google 模拟框架中的错误吗?如果没有,那么如何将我的模拟对象存储在堆中的智能指针中并正确使用它?

【问题讨论】:

  • 第二个示例中的foo 和mock 是什么?
  • 我认为问题在更深的地方。简单的空类 MockFoo 没有给我任何警告......
  • 和这个有关系吗:Why is GoogleMock leaking my shared_ptr??
  • 感谢大家为我指明正确的方向。你是对的@sklott,这是模拟对象的所有者没有被破坏的问题(见我的回答)。

标签: c++ unit-testing googletest googlemock gmock


【解决方案1】:

感谢@YSC、@sklott 和@Yksisarvinen 为我指明了正确的方向。

对于任何有类似问题的人。事实证明,就我而言,这个问题与 Google C++ 模拟框架无关。我将模拟对象传递给派生类,其基类的析构函数未声明为虚拟。因此,模拟所有者的析构函数从未被调用,模拟对象保持活动状态。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-11-26
    • 2017-04-07
    • 1970-01-01
    • 2016-08-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多