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

标签 c++ unit-testing pointers googletest googlemock

我刚刚开始使用 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/

相关文章:

android - Eclipse 中的 Robolectric 初始化错误

java - 在 Maven Surefire 插件中获取失败测试的值

c - 修改 C 函数内的二维 malloc 数组

IOS block 指针复制问题。

c - 如何将 C 指针递增 2

c++ - 在编译时截断字符串

c++ - 二进制 GCD - 算法太慢

c++ - 如何使用变体创建几何体

unit-testing - 单元测试 : Logging and Dependency Injection

c++ - 在命名空间中定义模板类成员函数?