gpt4 book ai didi

C++、Googlemock - 测试本地对象

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:33:29 26 4
gpt4 key购买 nike

我开始使用 googletest 和 googlemock 库,但遇到无法解决的问题。我有这样的代码:

class Painter
{
public:
void DrawSomething();
};

void Painter::DrawSomething()
{
Turtle turtle;
turtle.doSomething();
}

main()
{
Painter p;
p.DrawSomething();
}

我已经模拟了 Turtle 类,但是当本地创建 turtle 对象时,我如何测试 doSomething() 方法(例如使用 EXPECT_CALL)?不修改Painter类是否可行?

感谢您的回答。

最佳答案

I have mocked the Turtle class ...

你究竟是如何 mock 它的?

... but how can I test doSomething() method (for example with EXPECT_CALL) when the object of turtle is created locally? Is it possible without modifying Painter class?
(Emphasis mine)

直截了当的答案是:

在不通过接口(interface)解耦的情况下,您不能神奇地注入(inject)模拟而不是另一个类中使用的真实实例


您应该使用类似于以下代码的内容:

struct ITurtle {
virtual void PenUp() = 0;
virtual void PenDown() = 0;
virtual void TurnLeft(double degrees) = 0;
virtual void Move(double distance) = 0;
// ...
virtual ~ITurtle() {}
};

struct TurtleMock : ITurtle {
// Mock method declarations
MOCK_METHOD0(PenUp, void ());
MOCK_METHOD0(PenDown, void ());
MOCK_METHOD1(TurnLeft, void (double));
MOCK_METHOD1(Move, void (double));
};

class Turtle : public ITurtle {
public:
void PenUp();
void PenDown();
void TurnLeft(double degrees);
void Move(double distance);
};

在单独的翻译单元中为上述声明提供真正的实现。


class Painter {
public:
Painter(ITurtle& turtle) : turtle_(turtle) {}
void DrawSomething();
private:
ITurtle& turtle_;
};

void Painter::DrawSomething() {
turtle_.PenDown();
turtle_.TurnLeft(30.0);
turtle_.Move(10.0);
turtle_.TurnLeft(30.0);
turtle_.Move(10.0);
// ...
}

您也可以将 ITurtle 接口(interface)传递给 DrawSomething() 函数:

class Painter {
public:
void DrawSomething(ITurtle& turtle);
};

void Painter::DrawSomething(ITurtle& turtle) {
turtle.PenDown();
turtle.TurnLeft(30.0);
turtle.Move(10.0);
turtle.TurnLeft(30.0);
turtle.Move(10.0);
// ...
}

int main() {
NiceMock<TurtleMock> turtle;
Painter p(turtle);
// Painter p; <<< for the alternative solution

EXPECT_CALL(turtle,PenDown())
.Times(1);
EXPECT_CALL(turtle,TurnLeft(_))
.Times(2);
EXPECT_CALL(turtle,Move(_))
.Times(2);

p.DrawSomething();
// p.DrawSomething(turtle); <<< for the alternative solution

}

关于C++、Googlemock - 测试本地对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36896393/

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