gpt4 book ai didi

c++ - 泄漏的谷歌模拟对象不会失败

转载 作者:行者123 更新时间:2023-11-30 03:58:58 29 4
gpt4 key购买 nike

我在模拟 C++ 析构函数时遇到了一些奇怪的行为,如 google mock cookbook 中所述. class和mock如下:

// 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 Cheat Sheet :

Google Mock will verify the expectations on a mock object when it is destructed, or you can do it earlier

换句话说,您示例中的测试 3 和 4 从未验证过他们的期望,因为模拟对象没有被销毁。根据备忘单,您可以强制手动验证期望。例如,测试 3 变为以下内容:

MockBase * mb3 = new MockBase();
EXPECT_CALL(*mb3, Die());
Mock::VerifyAndClearExpectations(mb3);

关于c++ - 泄漏的谷歌模拟对象不会失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27140702/

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