模拟对象泄漏

时间:2018-08-21 08:51:42

标签: googlemock

我正在尝试通过以下方式(Class diagram)对我的项目使用googlemock:https://github.com/aniket11bh/TurtleMock

因此,基本上,我使用的是代理类(单例)来决定使用模拟对象还是实际对象。每当测试运行时,我injecting就将模拟对象放入代理类。

我还要提及的是,我在MockService.h和相应的MockService.cpp文件中明确提到了模拟类的构造函数和析构函数。

现在,

  • 我已经将接口类IService.h的析构函数声明为虚拟的。
  • mock对象是在堆栈上创建的。
  • 测试通过了。
  • 也已通过Mock::VerifyAndClearExpectations(&mockService);检查是否返回1。
  • 我也尝试过在堆上创建模拟对象,然后将其删除,但还是没有运气。

    TEST(ServiceTest, ServiceTest_1) 
    {
      MockService* mockService = new MockService();
      ServiceProxy::SetMockObject(mockService);
    
      EXPECT_CALL(*mockService, Walk(_)).WillOnce(Return(true));
    
      TurtleTest t;
      t.Walk("forward");
    
      ServiceProxy::SetMockObject(nullptr);
      bool result = Mock::VerifyAndClearExpectations(mockService);
    
      std::cout << " Result : " << result << std::endl;
      delete mockService; 
    }
    
  • 我已经在调试模式下检查了程序。因此,只要TEST结束,就会调用~MockService(),并最终从void Mock::UnregisterLocked(internal::UntypedFunctionMockerBase* mocker)调用gmock-spec-builder.cc,在Mock::AllowLeak(&mockService);处从状态中注销模拟对象。

即使在处理完这些事情之后,在运行单元测试时,它也会显示模拟对象泄漏为:

  

Source.cpp(24):错误:此模拟对象(在测试中使用   ServiceTest.ServiceTest_1)应该删除,但永远不要删除。它的地址   是@ 000000000031F4A0。错误:在程序中发现1个泄漏的模拟对象   出口。当模拟对象是   毁了。泄漏模拟意味着它没有期望   验证,通常是测试错误。如果您真的打算泄漏   模拟,您可以使用以下方法抑制此错误   testing :: Mock :: AllowLeak(mock_object),或者您可以使用假冒或存根   而不是模拟。

我知道可以使用{{1}}来解决问题,但是我不明白为什么首先要发生这种情况?在这种情况下有人可以帮我吗!

0 个答案:

没有答案