背景
在做需求的过程中,有一次修改了一个函数的原型(增加了一个参数),UT中的打桩还是使用的老的原型的,但是直接运行UT,竟然没有编译错误。于是就稍微研究了一下。
gMock在mock函数的时候不会检查与基类的参数一致性
例子如下
#include "gmock/gmock.h"
#include "gtest/gtest.h"
namespace testing {
class FooInterface {
public:
virtual ~FooInterface() {}
virtual int Add(int, int) = 0;
};
class FooInterfaceImp {
public:
virtual ~FooInterfaceImp() {}
virtual int Add(int a, int b)
{
return a + b;
}
};
class MockFoo : public FooInterfaceImp {
public:
MockFoo() {}
// Test reference qualified functions.
MOCK_METHOD1(Add, int(int));
MOCK_METHOD1(Example, int(int));
private:
GTEST_DISALLOW_COPY_AND_ASSIGN_(MockFoo);
};
class FunctionMockerTest : public testing::Test {
};
TEST(FunctionMockerTest, RefQualified) {
MockFoo mock_foo;
EXPECT_CALL(mock_foo, Add(_)) .WillOnce(Return(0));
EXPECT_CALL(mock_foo, Example(_)).WillOnce(Return(10));
EXPECT_EQ(mock_foo.Add(2), 0);
EXPECT_EQ(mock_foo.Example(10), 10);
}
} // namespace testing
基类FooInterfaceImp
中的函数Add
有2个参数,mock 类MocoFoo
中的函数Add
只有1个参数,但是这样可以编译成功。甚至于mock一个不存在的函数Example
,也不会有编译问题。
启示
鉴于以上的现象,在使用mock函数的时候,一定要人工检查
函数原型的正确性。
否则可能得到的不是预期结果。