Предположим, что существует объект Bar
, который использует объект Foo
.Владение является эксклюзивным, поэтому Bar
получает Foo
как std::unique_ptr
в своем конструкторе.Я хотел бы протестировать Bar
с помощью Google Test Framework, поэтому я сделал следующий код:
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 Test считает, что я не уничтожил mock_foo
, но не видит, что его не нужно удалять здесь, потому что он имеетбыл перемещен.Тест безопасен, потому что сам объект один и тот же, изменилось только право собственности (что и является моим намерением).
Верно ли мое предположение?Если да, как я могу подавить это сообщение об ошибке?Нет, где утечка памяти?