Поскольку a
будет пропущено, вы должны сообщить об этом gmock:
TEST(BDeathTest,BDies) {
MockA * a = new MockA;
ON_CALL(*a,bla(_)).WillByDefault(Return(1));
B * b = new B(a);
Mock::AllowLeak(a); // <=== Self-explanatory addition
EXPECT_DEATH(b->kill(),"");
delete a;
delete b;
}
Вы также можете использовать ::testing::FLAGS_gmock_catch_leaked_mocks = false;
, чтобы отключить обнаружение утечек gmock, но, вероятно, это плохая привычка. Это может быть уместно в этом случае, однако, если у вас есть большое количество фиктивных объектов при вызове exit()
. Также стоит включить его сразу после EXPECT_DEATH
на случай, если тест продолжит выполнять дальнейшую работу (хотя в приведенном выше примере включать его бессмысленно).
TEST(BDeathTest,BDies) {
MockA * a = new MockA;
ON_CALL(*a,bla(_)).WillByDefault(Return(1));
B * b = new B(a);
FLAGS_gmock_catch_leaked_mocks = false; // <=== Switch off mock leak checking
EXPECT_DEATH(b->kill(),"");
FLAGS_gmock_catch_leaked_mocks = true; // <=== Re-enable mock leak checking
// in case the test is refactored
delete a;
delete b;
}
Наконец, третий способ обработки этого конкретного случая состоит в том, чтобы delete a_;
в B::kill()
вместо того, чтобы позволить ему течь.
class B {
...
void kill() {
delete a_;
exit(1);
}
MockA * a_;
};
TEST(BDeathTest,BDies) {
MockA * a = new MockA;
ON_CALL(*a,bla(_)).WillByDefault(Return(1));
B * b = new B(a);
EXPECT_DEATH(b->kill(),"");
delete a;
delete b;
}
Поскольку gtest запускает новый процесс для выполнения теста на смерть, вы можете безопасно удалить a_
непосредственно перед exit
ing, а также удалить a
внутри тестового прибора.
Однако для тех, кто не знает, как работают gtest тесты на смерть, это будет выглядеть, как одна и та же переменная, удаляемая дважды, и может вызвать путаницу.