2014-11-26 2 views
1

Я столкнулся с каким-то странным поведением, когда насмехался с деструктором C++, как описано в google mock cookbook. Класс и издеваться следующим образом:Утечка Google Mock Object не сработала

// System under test 
class Base { 
public: 
    virtual ~Base(){}; 
}; 

// Mocked class 
class MockBase : public Base { 
public: 
    MOCK_METHOD0(Die, void()); 
    virtual ~MockBase() { Die(); } 
}; 

Тест 1. теста, что фиктивный объект разрушается один раз. Этот тест проходит просто отлично.

// Test 1. 
MockBase * mb1 = new MockBase(); 
EXPECT_CALL(*mb1, Die()).Times(1); 
delete mb1; 

Тест 2. Ожидая объект будет разрушен дважды, терпит неудачу. Это также имеет смысл.

// Test 2. This fails -> ok. 
MockBase * mb2 = new MockBase(); 
EXPECT_CALL(*mb2, Die()).Times(2); 
delete mb2; 

Тест 3. тестирование, что не удаленный объект разрушается. Этот тест делает не, похоже, терпит неудачу, хотя я ожидал, что он потерпит неудачу. (обратите внимание, что я прокомментировал команду delete). В конце программы есть предупреждения о том, что некоторые издевавшиеся объекты никогда не удаляются.

// Test 3. This does not fail 
MockBase * mb3 = new MockBase(); 
EXPECT_CALL(*mb3, Die()).Times(1); 
//delete mb3; 

Тест 4. тестирование, что не удаленный объект разрушается дважды. Этот тест, похоже, тоже не сработает. Подобно тесту 3, я тоже не удалял эту mockBase, поэтому я ожидал бы, что это тоже не удастся. Я даже увеличил количество раз, которое, как я ожидаю, будет называться, но он все равно не подводит.

// This does not fail 
MockBase * mb4 = new MockBase(); 
EXPECT_CALL(*mb4, Die()).Times(2); 
//delete mb4; 

Может кто-нибудь объяснить, почему испытания 3 и 4 проходят?

ответ

2

От Google Mock Cheat Sheet:

Google Mock проверит ожидания на макете объекта, когда он подорванный, или вы можете сделать это раньше

Другими словами, Test 3 и 4 в ваши примеры никогда не оправдывают ожиданий, потому что имитируемый объект не уничтожается. Согласно Cheat Sheet, вы можете принудительно проверить ожидания. Например, испытание 3 становится следующим:

MockBase * mb3 = new MockBase(); 
EXPECT_CALL(*mb3, Die()); 
Mock::VerifyAndClearExpectations(mb3);