【问题标题】:Leaked Google Mock Object Does not Fail泄露的 Google 模拟对象不会失败
【发布时间】:2014-11-26 03:14:05
【问题描述】:

我在模拟 c++ 析构函数时遇到了一些奇怪的行为,如 google mock cookbook 中所述。类和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 通过?

【问题讨论】:

    标签: c++ googlemock


    【解决方案1】:

    来自Google Mock Cheat Sheet

    Google Mock 会在模拟对象被破坏时验证它的期望,或者您可以更早地这样做

    换句话说,您的示例中的测试 3 和 4 永远不会验证它们的期望,因为模拟对象没有被破坏。根据备忘单,您可以强制手动验证期望。例如,测试 3 变为:

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

    【讨论】:

      猜你喜欢
      • 2020-01-05
      • 2011-06-11
      • 1970-01-01
      • 1970-01-01
      • 2014-02-25
      • 2014-03-08
      • 1970-01-01
      • 1970-01-01
      • 2015-01-27
      相关资源
      最近更新 更多