Я использую VS2005 и gmock 1.6. Я столкнулся с проблемой, чтобы издеваться над бесплатными глобальными функциями. Я заглянул в поваренную книгу Google, их решение требует от меня изменения исходных источников, а я не хочу этого делать. Я пытался издеваться над ним, используя глобальный фиктивный объект, но в этом случае я получаю утечку памяти или ошибку, что фиктивный объект должен быть удален, но никогда не удаляется.
Итак, проблема заключается в следующем:
У меня есть глобальная функция:
A* foo();
у меня пробный класс
class MockA : public A {
public:
MOCK_METHOD0 (bar1, bool());
MOCK_METHOD0 (bar2, bool());
};
В исходниках глобальная функция используется следующим образом:
if (foo()->bar1()){
// do something
}
if (foo()->bar2()){
// do something
}
Я не могу найти способ издеваться над этим поведением. Я попытался обернуть глобальную функцию «foo()» в класс интерфейса и использовал глобальный фиктивный объект для доступа к нему, но у меня возникают утечки памяти при вызове TearDown(). Может я не правильно сделал. Я сделал это так:
struct IFoo {
virtual A* foo() = 0;
virtual ~IFoo() {}
};
struct FooMock : public IFoo {
FooMock() {}
virtual ~FooMock() {}
MOCK_METHOD0(foo, A*());
};
FooMock fooMock; // global mock object
// foo() implementation
A* foo() {
return fooMock.foo();
}
В функции SetUp() я устанавливаю ожидания для глобального объекта, например
EXPECT_CALL(fooMock,foo())
.Times(1)
.WillOnce(Return(&mockObj));
где mockObj объявлен в классе Test. ТЕСТ(..., instA) {
// ...
}
Я не могу изменить первоисточники, так какие еще у нас есть варианты?