当模拟对象是unique_ptr中的包装器时,为什么GoogleMock会报告模拟对象泄漏?

时间:2019-07-19 03:14:23

标签: c++ googlemock

简单的测试用例

class Base {
 public:
  virtual int Foo() = 0;
};

class MockBase : public Base {
 public:
  MOCK_METHOD0(Foo, int());
};

void TestMethod(std::unique_ptr<Base> b) { b->Foo(); }

TEST(BaseTest, Normal) {
  auto mock_base = std::make_unique<NiceMock<MockBase>>();
  EXPECT_CALL(*mock_base, Foo()).WillOnce(Return(1));

  TestMethod(std::move(mock_base));
}

GoogleMock报告

  

错误:应删除此模拟对象(在测试BaseTest.Normal中使用),但绝不能删除。它的地址是@ 0x556d76a078c0。   错误:在程序出口发现1个泄漏的模拟对象。销毁模拟对象时,会验证对对象的期望。泄漏模拟意味着未验证其期望,这通常是测试错误。如果您确实打算泄漏模拟,可以使用testing :: Mock :: AllowLeak(mock_object)抑制此错误,或者可以使用伪造或存根代替模拟。

在我的期望中,模拟对象将由unique_ptr自动删除。我会错过什么吗?

1 个答案:

答案 0 :(得分:0)

我在https://stackoverflow.com/a/50495959/2968044找到了答案。

我缺少基类的虚拟析构函数。