You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用Google Test创建C++ Mock遇参数匹配问题及虚函数调用疑问

核心问题分析

你的原始B类中,bar函数是私有成员(C++类默认访问权限为private),这直接导致两个问题:

  1. A::foo无法直接调用b.bar(),私有成员仅允许类内部访问;
  2. 子类Btest无法override私有虚函数,Google Test的MOCK_METHOD也无法正确生成Mock方法。

正确实现方案

1. 修正基类B的访问权限

将bar设为public(因为A需要调用该方法,若仅允许子类访问可设为protected,但不符合当前场景):

class B
{
public:
    virtual void bar() { /* 原实现逻辑 */ };
};

class A {
public:
    void foo(B& b) { b.bar(); }
};

2. 编写正确的Mock类

继承B并override public的bar函数,使用Google Test的MOCK_METHOD宏:

#include <gmock/gmock.h>

class Btest : public B
{
public:
    MOCK_METHOD(void, bar, (), (override));
};

3. 测试用例编写

此时Btest对象可以正常传递给A::foo(子类对象可绑定到基类引用,符合参数要求),还可以设置调用期望:

TEST(A_Foo_Test, CallsBarOnMockB)
{
    A a;
    Btest b;

    // 设置期望:bar方法被调用一次
    EXPECT_CALL(b, bar()).Times(1);

    a.foo(b); // 编译正常,实际调用Mock类的bar方法
}

关于向上转型的疑问

不会调用原类的bar方法。C++多态特性决定:当通过基类引用(B&)调用虚函数时,实际执行的是当前绑定的子类对象(Btest)的override方法(即你Mock的版本)。无论显式向上转型(如static_cast<B&>(b))还是隐式传递子类对象给基类引用,都会触发多态调用,执行Mock实现。

内容的提问来源于stack exchange,提问作者Kronephon

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.03 07:09:39