gMock在mock函数的时候不会检查与基类的参数一致性

本文揭示了在使用gMock进行单元测试时,mock函数不检查与基类函数原型一致性的现象。即使mock函数参数数量与基类函数不同,甚至mock不存在的函数,也能通过编译。作者提醒开发者在使用mock时务必手动检查函数原型,以避免非预期的测试结果。
摘要由CSDN通过智能技术生成

背景

在做需求的过程中,有一次修改了一个函数的原型(增加了一个参数),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函数的时候,一定要人工检查函数原型的正确性。
否则可能得到的不是预期结果。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值