GMock:如何返回由EXPECT_CALL()

时间:2017-07-14 13:18:41

标签: c++ lambda googletest gmock

我正在使用一个框架,它将函数指针传递为void*。我想要一个mock来返回一个函数指针,我想在原地定义函数(就像一个lambda;它不能工作如下所示)。

最小的工作示例如下所示。

#include <gtest/gtest.h>
#include <gmock/gmock.h>

using namespace std;
using namespace testing;

class Original
{
public:
    typedef int(*fptr)();

    void Func() 
    {
        void* f = Func2();
        fptr func = reinterpret_cast<fptr>(f);
        if (func) {
            int i = func();
            if (i == 1) {
                //do something
            } else if (i == 3) {
                //NOTE my unit test should test this decision branch
            }
        }
    }

    static int Func3() {return 1;}

    virtual void* Func2() {return (void*)&Func3;}
};

class MyMock : public Original
{
public:
    MOCK_METHOD0(Func2, void*());
};

我的主要目标:我想摆脱这个功能,并在EXPECT_CALL()中内联定义。见下文。

int MockFunc() {cout << "mock func" << endl; return 3;}

测试用例:

TEST(MYTEST, Test)
{
    MyMock m;

    //WORKS: compiles and works as expected, 
    //but I do not want to use **MockFunc**
    EXPECT_CALL(m, Func2()).Times(AtLeast(1))
        .WillRepeatedly(Return(&MockFunc)); 

    //DOES NOT WORK: Does not compile, of course 
    //(compiler message below this code block)
    EXPECT_CALL(m, Func2()).Times(AtLeast(1))
        .WillRepeatedly(Return((void*)&([](){return 3;}))); 
    m.Func();
}

main.cpp:117:90:错误:获取临时[-fpermissive]的地址

为完整起见,main()

int main(int argc, char** argv)
{    
    ::testing::InitGoogleTest(&argc, argv);
    return RUN_ALL_TESTS();
}

问题再次提出:我如何摆脱MockFunc()功能并在Return()内就地定义其内容?

1 个答案:

答案 0 :(得分:4)

以下陈述应该有效:

EXPECT_CALL(m, Func2()).Times(AtLeast(1)).WillRepeatedly(Return((void*)(+([](){return 3;}))));

它利用了非捕获lambdas衰变为函数指针的事实 换句话说,表达式(+([](){return 3;})的结果类型为int(*)()。然后,您可以像往常一样将其投射到void*。错误也应该消失,因为你不再获得临时的地址。