泄露的谷歌模拟对象不会失败

Leaked Google Mock Object Does not Fail

本文关键字:失败 对象 模拟 谷歌      更新时间:2023-10-16

我在模拟 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);