Google Mock:将指针传递给模拟对象,但方法调用仍在调用真实方法

时间:2019-08-05 11:06:12

标签: c++ googlemock

我有这个简单的代码

struct SimpleStruct {
    int add(int a, int b) {
        return a+b;
    }
};

class SimpleClass {
public:
    int SimpleMethod(SimpleStruct* simpleStruct, int a, int b) {
        return simpleStruct->add(a, b);
    }
};

现在,我想测试SimpleMethod并像这样模拟SimpleStruct

struct MockSimpleStruct : public SimpleStruct {
    MOCK_METHOD(int, add, (int, int), (const));
};


TEST(Test_Calculation, simpleStruct) {
    MockSimpleStruct mockSimpleStruct;

    EXPECT_CALL(mockSimpleStruct, add(_,_)).Times(2).WillOnce(DoAll(Return(7))).WillOnce(DoAll(Return(7)));
    EXPECT_EQ(7, mockSimpleStruct.add(2, 3)); // working fine

    SimpleClass simpleClass;
    int result = simpleClass.SimpleMethod(&mockSimpleStruct, 2, 3); // not working: inside SimpleMethod the real add method is called

    EXPECT_EQ(7, result); // fails
}

如何确保使用了模拟方法?

我的问题与this Question有关,但是我无法更改SimpleMethod签名中对SimpleStruct的使用,因为在我的情况下,我的签名是通过jni定义的。

1 个答案:

答案 0 :(得分:1)

Gmock只能模拟virtual函数,因此为了使其正常工作add()应该声明为虚函数。但是只需要将其虚拟化即可进行单元测试,因此您可以执行以下操作:

#ifdef UNDER_TEST
#define TEST_VIRTUAL virtual
#else
#define TEST_VIRTUAL
#endif

struct SimpleStruct {
    TEST_VIRTUAL int add(int a, int b) {
        return a+b;
    }
};

只需确保测试的代码不依赖于SimpleStruct是POD的事实。