как издеваться над глобальной бесплатной функцией с помощью gmock

Я использую 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) {

    // ...
}

Я не могу изменить первоисточники, так какие еще у нас есть варианты?


person Muhammad Hassan    schedule 23.02.2015    source источник