【问题标题】:How to simulate an EXPECT_CALL with gtest如何使用 gtest 模拟 EXPECT_CALL
【发布时间】:2020-09-16 18:52:36
【问题描述】:

在下面的代码中,我尝试在基本模型上解释我的问题。

class A
{
    public:
    A() {}
    virtual void foo() {}
    virtual ~A(){}
    //...
};
    

class B : public A{
    public:
    B(){}
    //...
    //does not contain the override function foo() 
};

class MustBeTested{
    public:
    MustBeTested(){
        //...    
    }
    void function()
    {
        m_elem->foo();
        //...
    }
    
    private:
    B* m_elem;
};


class Mock : public B {
    public:
    Mock() {}
    MOCK0(foo, void());
};

//test function from above class
void TestFunction
{
    Mock* dummy = new Mock;
    EXPECT_CALL(*dummy, foo()).Times(1);
    //i know it is wrong becase the called method is A::foo();
}


    

我有一个包含虚方法的基本类 A。 派生类 B 不再包含被覆盖的方法 foo()。 MustBeTested 类包含要测试的函数,类成员类型为 B *。 最初没有看我开始制作一个从 B 派生的 Mock 类来模拟 EXPECT_CALL()。 我意识到这是不可能的,因为 A :: foo () 中的方法总是会被调用。

我的问题是,是否有一种解决方法而不更改 A 类或 B 类代码?

【问题讨论】:

    标签: c++ unit-testing googletest googlemock


    【解决方案1】:

    B 中的foo 未被覆盖,但它存在 - 使用来自A 的默认实现。 foo 是虚拟的,可以在派生自B 的类中被覆盖,例如您的Mock(如果fooB 中标记为final,这是不可能的)。如果您将在 MustBeTested 中使用依赖注入,您的代码将起作用,请参阅 Dependency injection with unique_ptr to mock

    【讨论】:

      猜你喜欢
      • 2022-11-21
      • 1970-01-01
      • 1970-01-01
      • 2017-02-26
      • 2022-07-26
      • 2022-07-27
      • 2020-10-29
      • 2022-08-10
      • 1970-01-01
      相关资源
      最近更新 更多