我有这个简单的代码
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定义的。
答案 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的事实。