我使用GoogleMock/GoogleTest進行測試,並且當匹配器將shared_ptr作爲參數作爲模擬,並且在相同的shared_ptr上調用EXPECT時,我看到一些奇怪的行爲。違規的一段代碼:爲什麼GoogleMock泄漏我的shared_ptr?
#include <gmock/gmock.h>
#include <gtest/gtest.h>
#include <boost/shared_ptr.hpp>
#include <boost/make_shared.hpp>
using namespace boost;
using namespace testing;
struct MyParameter
{
virtual ~MyParameter() {}
virtual void myMethod() = 0;
};
struct MyParameterMock : public MyParameter
{
MOCK_METHOD0(myMethod, void());
};
struct MyClass
{
virtual ~MyClass() {}
virtual void myMethod(shared_ptr<MyParameter> p) {}
};
struct MyClassMock : public MyClass
{
MOCK_METHOD1(myMethod, void(shared_ptr<MyParameter>));
};
TEST(LeakTest, GoogleMockLeaksMatchedPointer)
{
shared_ptr<MyClassMock> c = make_shared<MyClassMock>();
shared_ptr<MyParameterMock> p = make_shared<MyParameterMock>();
{
InSequence dummy;
EXPECT_CALL(*c, myMethod(Eq(p)));
EXPECT_CALL(*p, myMethod());
}
c->myMethod(p);
p->myMethod();
}
當運行這個測試,我得到
leak_ptr_mock.cpp:37: ERROR: this mock object (used in test LeakTest.GoogleMockLeaksMatchedPointer) should be deleted but never is. Its address is @0x9309544.
ERROR: 1 leaked mock object found at program exit.
爲什麼發生這種情況的任何想法?我寧願不必使用Mock::AllowLeak
。
它的工作原理,弗雷澤!我也根據你的建議更正了代碼。 – 2012-04-30 21:23:19
@bruno nery:您使用的是哪個版本的GoogleMock? – 2012-05-07 10:39:50
如果在c之前創建p,會發生什麼?不會比在最後c被破壞,它的期望得到驗證並被清除,這將導致p的參考計數器遞減。在此之後,由於計數器現在爲0,p將被銷燬,驗證並完全銷燬。 – 2012-05-07 11:44:46