Это происходит потому, что вы включили флаг throw_on_failure
- как уже упоминалось в Google Mock ForDummies :
Этот подход имеет подвох: он заставляет Google Mock выдавать исключениеиногда из деструктора фиктивного объекта.
Так как из деструктора выбрасывается исключение, фиктивный объект никогда не удаляется полностью, и фреймворк жалуется на это, когда программа заканчивается.
Самое простое решение этой проблемы - использовать Google Test в качестве основы для модульного тестирования и отключить флаг throw_on_failure
(состояние по умолчанию) - GTest автоматически не проходит тест, если фиктивные ожидания не удовлетворяются в пределах.
Если вы не можете использовать Google Test, потому что вы используете другую платформу (например, CppUnit), вы можете переписать ваше тело теста следующим образом:
void TestAFunctionInFoo()
{
::testing::GTEST_FLAG(throw_on_failure) = true;
BarMock barMock;
try
{
std::unique_ptr<Foo> newFoo(new Foo(&barMock));
EXPECT_CALL(barMock, b());
EXPECT_CALL(barMock, c("hello")).WillOnce(Return(42));
newFoo->a();
::testing::Mock::VerifyAndClearExpectations(&barMock);
}
catch (std::exception& e)
{
// expectations failed - do whatever you want
}
::testing::GTEST_FLAG(throw_on_failure) = false;
}
VerifyAndClearExpectations(void*)
проверяет, удовлетворены ли данные ложные ожидания - если нет, иФлаг throw_on_failure
включен, он выдает исключение.
Таким образом, ваш фиктивный объект будет уничтожен должным образом, и у вас все равно будет исключение, если что-то пошло не так.
Кстати: избегайте использованияcatch (...) { }
- это вообще плохая идея, которая в большинстве случаев доказывает плохое качество кода.