为什么谷歌测试/模拟显示 std::unique_ptr 泄露的模拟对象错误?
Why does Google Test/Mock show leaked mock object error by std::unique_ptr?
假设有Bar
对象使用Foo
对象。所有权是排他性的,因此Bar
在其构造函数中作为std::unique_ptr
Foo
。我想用谷歌测试框架测试Bar
,所以我做了一个以下代码:
using namespace testing;
class Foo
{
public:
virtual int F() = 0;
};
class Bar
{
public:
Bar(std::unique_ptr<Foo>&& foo) : m_foo(std::move(foo))
{
}
int B()
{
return m_foo->F();
}
private:
std::unique_ptr<Foo> m_foo;
};
class MockFoo : public Foo
{
public:
MOCK_METHOD0(F, int());
};
class BarTest : public Test
{
};
TEST_F(BarTest, Test1)
{
auto mock_foo = std::make_unique<MockFoo>();
ON_CALL(*mock_foo, F()).WillByDefault(Return(1));
Bar bar(std::move(mock_foo));
auto val = bar.B();
EXPECT_THAT(val, 1);
}
测试运行良好,但我收到以下错误:
。test.cpp:293:错误:这个模拟对象(在测试 BarTest.Test1 中使用(应该被删除,但永远不会删除。它的地址是@0x1c7c590。 错误:在程序退出时发现 1 个泄漏的模拟对象。
我认为Google测试认为我没有销毁mock_foo
但是它没有看到它不必在此处删除,因为它已被移动。测试是安全的,因为对象本身是相同的,只是所有权发生了变化(这是我的意图(。
我的假设正确吗?如果是,如何禁止显示此错误消息?我不,内存泄漏在哪里?
问题是Foo
没有虚拟析构函数。 因此,std::unique_ptr<Foo>
不会调用派生类的析构函数,而只是调用Foo
的析构函数。
class Foo
{
public:
virtual ~Foo() = default;
virtual int F() = 0;
};
请参阅何时使用虚拟析构函数?如果基类Foo
具有虚函数,则它应具有虚拟析构函数或非公共析构函数。
相关文章:
- 为什么谷歌测试/模拟显示 std::unique_ptr 泄露的模拟对象错误?
- 是否可以使用 EXPECT_CALL 来验证模拟对象的构造函数是否在某些时候调用成员函数?
- 模拟对象与模拟提升::测试
- 期望在模拟对象上调用了某个方法.它会破坏封装吗?
- 仔细阅读模拟对象的期望
- gmock-模拟对象及其内部模拟方法
- 在C 中将模拟对象施加到其抽象基类
- 模拟对象 c++
- 如何使模拟对象在Google模拟中抛出一个例外
- 将模拟对象分配给受保护的成员
- 谷歌模拟全局模拟对象内存泄漏
- 为了模拟对象,我们是否应该声明所有成员函数 virtual(C++)
- 如何将模拟对象与智能指针一起使用
- 泄露的谷歌模拟对象不会失败
- 我可以复制一个谷歌模拟对象后设置期望
- 如何生成在被测试类中创建的模拟对象
- 如何注入模拟对象
- Google Mock:在程序出口处发现泄漏的模拟对象
- GMock将一个模拟对象传递给另一个对象,并调用一个stubed方法,这仍然是在调用真正的逻辑
- 单元测试——不直接使用被模拟对象的Google Mock (c++)