我正在尝试通过以下方式(Class diagram)对我的项目使用googlemock:https://github.com/aniket11bh/TurtleMock
因此,基本上,我使用的是代理类(单例)来决定使用模拟对象还是实际对象。每当测试运行时,我injecting就将模拟对象放入代理类。
我还要提及的是,我在MockService.h和相应的MockService.cpp文件中明确提到了模拟类的构造函数和析构函数。
现在,
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}}来解决问题,但是我不明白为什么首先要发生这种情况?在这种情况下有人可以帮我吗!