gpt4 book ai didi

在同一类的另一个方法中调用 C++ GoogleMock 模拟方法

转载 作者:行者123 更新时间:2023-12-01 14:59:07 25 4
gpt4 key购买 nike

我在这里看这个问题: Can googlemock mock method calls from within other method calls of the same class?

并尝试实现答案,但它对我不起作用。

我已经修改了链接问题的实现以删除模拟 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; }
private:
int x;
};

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

MOCK_METHOD1(ReturnInput, int(int y));

private:
MyClass real;
};

TEST(MyClassTest, mockUseClassMethod)
{
MockMyClass mock;

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

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

这仍然返回相同的失败

/projects/tests/cpp/google-test/test.cpp:46: Failure
Expected: 3
To be equal to: mock.ReturnInputPlus1(1)
Which is: 2
/projects/tests/cpp/google-test/test.cpp:41: Failure
Actual function call count doesn't match EXPECT_CALL(mock, ReturnInput(_))...
Expected: to be called once
Actual: never called - unsatisfied and active

最佳答案

如果不在 MyClass 中创建方法,我看不到一种方法可以实现对模拟行为的内部调用的重定向 virtual .

下面是一个工作示例:

  • 删除了real 成员,mock 仍然继承了 MyClass
  • 我想“技巧”是知道可以像这样调用父类行为:mock.MyClass::ReturnInputPlus1(1) ( qualified name lookup ) 并理解 dynamic dispatch将导致使用 M​​ockMyClass::ReturnInput。
  • 我不太确定 MyClass::x 想要实现什么,因为它会被函数参数遮蔽。

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

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

private:
int m_x;
};

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

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

TEST(MyClassTest, mockUseClassMethod)
{
MockMyClass mock;

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

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

关于在同一类的另一个方法中调用 C++ GoogleMock 模拟方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48696248/

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