我刚刚开始使用 GoogleTest 和 GoogleMock。阅读"for dummies" documentation该示例测试依赖于 Turtle
的 Painter
类:
真实对象-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/