GMock将一个模拟对象传递给另一个对象,并调用一个stubed方法,这仍然是在调用真正的逻辑

GMock passing a mocked object into another, and calling a stubed method is still calling real logic

本文关键字:一个 调用 仍然是 方法 stubed 一个对象 对象 模拟 GMock      更新时间:2023-10-16

我正试图将一个模拟对象传递给另一个对象的方法并调用它,得到的结果与调用实际方法的结果相同。

fooa.h-这是真正的类

#ifndef FOOA_H
#define FOOA_H
class FooA
{
public:
 FooA();
 virtual int method(int a, int b, int c, int d);
};
#endif // FOOA_H

fooa.pp

#include "fooa.h"
FooA::FooA()
{
}
int FooA::method(int a, int b, int c, int d)
{
    return a+b+c+d;
}

mockedfooa.h-模拟版的fooa

#ifndef MOCKEDFOOA_H
#define MOCKEDFOOA_H
#include "fooa.h"
#include <gmock/gmock.h>

class MockedFooA : public FooA
{
public:
    MOCK_METHOD4( method, int(int a, int b, int c, int d) );
};
#endif // MOCKEDFOOA_H

这个类调用FooA类中的方法

#include "fooa.h"
#include <iostream>
class Calculator
{
public:
    Calculator()
    { }
    void doCalc(FooA foo)
    {
        int a = 3, b =4 ,c = 12, d = 41;
        std::cout<<foo.method(a,b,c,d)<<std::endl;
    }
};

我的主要功能

#include "MockedFooA.h"
#include "calc.h"
using ::testing::_;
using ::testing::Return;
using namespace std;
int main(int argc, char *argv[])
{
    Calculator oCalc; // object that uses the oFoo.method
    FooA oFoo;//not mocked
    oCalc.doCalc(oFoo);
    MockedFooA oMockedFoo ; // mocked
    ON_CALL(oMockedFoo,method(_,_,_,_)).WillByDefault(Return(20));
    oCalc.doCalc(oMockedFoo);
}

输出为

60
60

因此,即使它被存根化,doCalc仍然调用真实的方法。

我的问题是:为什么当我把嘲笑的物体传给doCalc方法没有调用存根方法?

问题是您正在按值传递模拟对象。由于mock对象利用继承提供的动态绑定,因此需要使用引用或指针来传递它们。否则,您最终会对对象进行切片。

要实现所需的行为,请更改doCalc方法,以通过引用而不是通过值获取FooA参数。像这样:

void doCalc(FooA& foo)