gpt4 book ai didi

c++ - 为什么在使用解除引用的指针时 EXPECT_CALL 测试意外通过?

转载 作者:搜寻专家 更新时间:2023-10-31 00:08:49 31 4
gpt4 key购买 nike

我刚刚开始使用 GoogleTest 和 GoogleMock。阅读"for dummies" documentation该示例测试依赖于 TurtlePainter 类:

真实对象-Turtle.h

class Turtle {
public:
virtual ~Turtle() {}
virtual void PenDown() = 0;
};

模拟对象 - mock-turtle.h

class MockTurtle : public Turtle {
public:
MOCK_METHOD0(PenDown, void());
};

被测代码-Painter.h

class Painter {
public:
Painter(Turtle *turtle){};
};

单元测试 - test_painter.cpp

这是为了测试 turtle.PenDown() 方法是否被 Painter 构造函数调用。

TEST(PainterTest, CanDrawSomething) {
MockTurtle turtle;
EXPECT_CALL(turtle, PenDown())
.Times(AtLeast(1));
Painter painter(&turtle);
}

此测试正确地失败了,因为从未调用过 PenDown()

但是,如果我将测试更改为使用指向 MockTurtle 的取消引用指针,它会错误地 通过。

TEST(PainterTest, CanDrawSomething) {
MockTurtle *turtle = new MockTurtle();
EXPECT_CALL(*turtle, PenDown())
.Times(AtLeast(1));

Painter painter(turtle);
}

为什么这个测试在使用解引用指针时通过?我的代码中没有任何地方调用了 PenDown()

对于更多上下文,我想使用指向 MockTurtle 的指针,以便我可以在测试夹具中初始化它,以便其他测试可以使用它。

最佳答案

您不会删除您的指针。

并且并不是忘记删除它会导致 PenDown() 被推送。该成员永远不会被调用。但将结果报告给框架的是 MockTurtle析构函数

当你泄漏它时,没有任何报告。该框架认为您运行了一个空测试(空洞地通过了),因为它没有得到任何反馈。

turtle 是一个具有自动存储持续时间的对象(不是指针)时,它的析构函数会在作用域退出时自动调用。所以才报错。

这只是利用 RAII 的 GoogleMock用于样板文件。

关于c++ - 为什么在使用解除引用的指针时 EXPECT_CALL 测试意外通过?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46827890/

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