gpt4 book ai didi

c++ - GMock 将一个模拟对象传递给另一个对象,调用 stub 方法仍然是调用真实逻辑

转载 作者:行者123 更新时间:2023-11-28 06:56:40 24 4
gpt4 key购买 nike

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

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.cpp

#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

calculator.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

所以看起来即使它被 stub doCalc 仍然调用真正的方法。

我的问题是:为什么当我将模拟对象传递给 doCalc 方法没有调用 stub 方法?

最佳答案

问题是您按值传递模拟对象。由于模拟对象利用继承提供的动态绑定(bind),您需要使用引用或指针来传递它们。否则你最终会得到 slicing your objects .

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

void doCalc(FooA& foo)

关于c++ - GMock 将一个模拟对象传递给另一个对象,调用 stub 方法仍然是调用真实逻辑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23063013/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com