如何使用gmock模拟全局自由函数

时间:2015-02-23 07:37:44

标签: c++ unit-testing gmock

我正在使用VS2005和gmock 1.6。我面临着模拟自由全局功能的问题。我查看谷歌食谱,他们的解决方案要求我改变原始来源,我不想这样做。我试图使用全局模拟对象来模拟它,但在这种情况下,我得到内存泄漏或模拟对象应该被删除的错误,但从来没有。

所以,问题如下:

我有一个全局功能:

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()函数中,我在全局对象上设置了Expectations,如

EXPECT_CALL(fooMock,foo())  
    .Times(1)  
    .WillOnce(Return(&mockObj));  

其中mockObj在Test类中声明。     TEST(...,instA){

    // ...
}

我无法更改原始资料,我们还有其他选择吗?

0 个答案:

没有答案