泄露的谷歌模拟对象不会失败
Leaked Google Mock Object Does not Fail
我在模拟 c++ 析构函数时遇到了一些奇怪的行为,如谷歌模拟食谱中所述。班级和模拟如下:
// System under test
class Base {
public:
virtual ~Base(){};
};
// Mocked class
class MockBase : public Base {
public:
MOCK_METHOD0(Die, void());
virtual ~MockBase() { Die(); }
};
测试 1.测试模拟对象是否被销毁一次。这个测试通过得很好。
// Test 1.
MockBase * mb1 = new MockBase();
EXPECT_CALL(*mb1, Die()).Times(1);
delete mb1;
测试 2.期望一个对象被破坏两次,失败。这也是有道理的。
// Test 2. This fails -> ok.
MockBase * mb2 = new MockBase();
EXPECT_CALL(*mb2, Die()).Times(2);
delete mb2;
测试 3.测试未删除的对象是否已销毁。这个测试似乎没有失败,即使我预计它会失败。(请注意,我注释掉了删除命令)。在程序结束时,有警告说某些模拟对象永远不会被删除。
// Test 3. This does not fail
MockBase * mb3 = new MockBase();
EXPECT_CALL(*mb3, Die()).Times(1);
//delete mb3;
测试 4.测试未删除的对象是否被销毁两次。这个测试似乎也没有失败。与测试 3 类似,我也没有删除这个 mockBase,所以我希望它也会失败。我什至增加了我希望调用它的次数,但它仍然没有失败。
// This does not fail
MockBase * mb4 = new MockBase();
EXPECT_CALL(*mb4, Die()).Times(2);
//delete mb4;
有人可以解释为什么测试 3 和 4 通过吗?
来自谷歌模拟备忘单:
Google Mock 会在模拟对象被破坏时验证对它的期望,或者您可以更早地这样做
换句话说,示例中的测试 3 和 4 从未验证过他们的期望,因为模拟对象不会被销毁。 根据备忘单,您可以强制手动验证期望。 例如,测试 3 变为以下内容:
MockBase * mb3 = new MockBase();
EXPECT_CALL(*mb3, Die());
Mock::VerifyAndClearExpectations(mb3);
相关文章:
- 自定义对象的dlib序列化在gcc中失败
- CMake + Qt,moc 编译失败,无法实现 QMetaObject 方法(编译器找不到基本 ui 对象的标头?
- std::list::merge() 对于包含对象的列表失败
- 断言"IsObject()"在通过 Boost ASIO 发送对象时失败
- 使用方法失败更改constexpr对象成员
- C 如何停止对象构建失败的执行
- 使用GDI+删除位图和CLSID对象时,C++内存管理失败
- 为什么在 std::transform 中使用函数对象参数失败并且需要 lambda 表达式
- C++中的即时对象初始化失败,出现LNK2005错误
- 为什么为我的对象类编译标准优先级队列失败
- C++动态转换失败/子对象被视为父对象
- 创建对象时调试断言失败
- C++全局对象初始化失败——为什么?以及是否可以将对象放入.DATA部分
- 对象的c++数组,初始化失败
- 如果插槽对象包含互斥锁和条件变量,则 Boost signals2 connect() 调用编译失败
- 尝试在 QLabel 上绘画失败(无法在没有对象的情况下调用成员函数"虚拟无效 QLabel::p aintEvent(QPaintEvent*)")
- 内置对象/库的静态初始化顺序失败
- 删除对象时调试断言失败
- SDL_SetVideoMode() 失败,找不到匹配的 GLX 视觉对象?
- 类对象的运行时检查失败 #2