gpt4 book ai didi

c++ - googlemock 可以从同一类的其他方法调用中模拟方法调用吗?

转载 作者:搜寻专家 更新时间:2023-10-31 01:55:01 25 4
gpt4 key购买 nike

是否可以从同一类的其他方法调用中模拟方法调用?我是 C++ 的新手(主要是 C 开发人员)并且是 googlemock 和 Google Test 的新手所以如果在其他地方回答了这个问题并且我不明白答案,请原谅我!下面是一个简单的例子,应该解释我想做什么。使用下面的示例,我想模拟 ReturnInput,同时测试 ReturnInputPlus1

using ::testing::Invoke;
using ::testing::_;
using ::testing::Return;

class MyClass
{
public:
MyClass() : x(1) {}
virtual ~MyClass() {}

int ReturnInput(int x) { return x; }
int ReturnInputPlus1(int x) { return ReturnInput(x) + 1; }
};

class MockMyClass : public MyClass
{
public:
MockMyClass()
{
ON_CALL(*this, ReturnInput(_)).WillByDefault(Invoke(&real, &MyClass::ReturnInput));
ON_CALL(*this, ReturnInputPlus1(_)).WillByDefault(Invoke(&real, &MyClass::ReturnInputPlus1));
}
virtual ~MockMyClass() {}

MOCK_METHOD1(ReturnInput, int(int y));
MOCK_METHOD1(ReturnInputPlus1, int(int));

private:
MyClass real;
};

TEST(MyClassTest, mockUseClassMethod)
{
MockMyClass mock;

EXPECT_CALL(mock, ReturnInput(_))
.WillOnce(Return(2));
EXPECT_CALL(mock, ReturnInputPlus1(_))
.Times(1);

EXPECT_EQ(3, mock.ReturnInputPlus1(1));
}

当我运行上述测试时,我希望所有测试都能成功。相反,我得到以下输出:

1>[ RUN      ] MyClassTest.mockUseClassMethod
1>.\MyClassTest.cpp(15): error: Value of: mock.ReturnInputPlus1(1)
1> Actual: 2
1>Expected: 3
1>.\DllInfoTest.cpp(10): error: Actual function call count doesn't match EXPECT_CALL(mock, ReturnInput(_))...
1> Expected: to be called once
1> Actual: never called - unsatisfied and active

最佳答案

您对 MockMyClass::ReturnInputPlus1(1) 的调用默认在 real 上调用 MyClass::ReturnInputPlus1(1),它调用 MyClass::ReturnInput(2)ReturnInputPlus1() 运行的对象不是 mock,它是 mock.real,当它调用 ReturnInput() 它调用函数的原始版本。您想要做的是创建一个 MockMyClass,它具有 ReturnInput() 的模拟覆盖但根本不模拟 ReturnInputPlus1() - 您不想要同时拥有您的类的模拟版本和它有时委托(delegate)给的真实版本。

关于c++ - googlemock 可以从同一类的其他方法调用中模拟方法调用吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8919487/

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