2015-01-22 2 views
0

Я прочитал раздел в кулинарной книге gmock по телефону Mocking Destructors, но мне не повезло, что он работает. Мой код почти точно соответствует документу:Звонок с вызовом деструктора GMock

class MockFoo : public Foo { 
public: 
    MockFoo() {} 
    MOCK_METHOD0(destroyMockFoo, void()); 
    virtual ~MockFoo() { destroyMockFoo(); } 
}; 

TEST_F(DestructorTest, shouldFail) { 
    MockFoo* foo = new MockFoo(); 
    EXPECT_CALL(*foo, destroyMockFoo()); 
} 

Но когда я запускаю код, тест проходит без ошибок. Я получаю ошибку в конце испытательного выхода о просочилась объекта:

DestructorTest.cpp:149: ERROR: this mock object (used in test DestructorTest.shouldFail) should be deleted but never is. Its address is @0x8178790. 
ERROR: 1 leaked mock object found at program exit. 

, но это не то, что я хочу, и не то, что доктор говорит, что должно произойти.

Так что же вы делаете неправильно?

ответ

0

Вы не делаете ничего плохого, обязательно. Проблема здесь в том, что ожидания gmock проверяются в деструкторе макетного объекта, поэтому, если деструктор никогда не вызывается, ожидания никогда не проверяются. Это то, что происходит в вашем примере.

Самый простой способ обойти это явно проверить ожидания на макет:

Mock::VerifyAndClearExpectations(foo); 

Это даст вам поведение, которое вы ищете.

+0

'VerifyAndClearExpectations' будет работать, но правильное поведение здесь, я думаю, состоит в том, чтобы просто удалить макет объекта в конце теста. – VladLosev

+0

Это тоже возможность, хотя я предполагаю, что прецедентом здесь является передача права собственности на объект-макет другому классу и проверка того, что другой класс правильно распоряжается макетом. Удаление макета в конце теста не позволит этого типа проверки. – Ian

+0

Ян прав. В моем реальном тестировании передается право собственности на макет, и я решил проверить, что макет действительно удален. – DaveR

0

Удалить объект foo в конце теста, чтобы он не пропускал объект.

+0

Думаю, вы пропустили точку сообщения. Дело в том, что тест проходит, когда он не должен. Поскольку ожидание не выполняется, тест должен завершиться неудачей. Упоминание сообщения об ошибке про просочившийся объект было лишь побочным примечанием. Как отметил Ян, добавление Mock :: VerifyAndClearExpectations (foo) к тесту приводит к сбою. – DaveR

0

Во избежание сообщения об утечке памяти вы можете проверить возвращаемое значение Mock :: VerifyAndClearExpectations (foo) и явно удалить объект, если он ложный.