我有一个适用于原始指针的测试,但我无法使用std::shared_ptr
。课程是这样的:
class MyClass
{
MyClass(SomeService *service);
void DoIt();
}
我的测试代码如下:
class MyClassTests : public ::testing::Test
{
public:
MyClassTests():
myClass_(new MyClass(&service_))
{}
protected:
SomeServiceFake service_;
MyClassSharedPointer myClass_;
};
TEST_F(MyClassTests, DoIt_DoesNotMeetCriteria_DoesNotPerformAction) {
// Arrange
EXPECT_CALL(service_, MeetsCriteria(_))
.WillRepeatedly(Return(false));
EXPECT_CALL(service_, PerformAction(_))
.Times(0);
// Act
myClass_->DoIt();
}
在此测试中,service_
是在测试中在堆栈上创建的模拟/假冒,我将地址传递给MyClass
的构造函数。将MyClass
改为service
作为shared_ptr
,我的新课程如下:
class MyClass
{
MyClass(std::shared_ptr<SomeService> service);
DoIt();
}
我在测试中尝试的是:
class MyClassTests : public ::testing::Test
{
public:
MyClassTests():
myClass_(new MyClass(std::shared_ptr<SomeService>(&service_)))
{
}
...
但是,当我这样做时,测试失败了:
Debug Assertion Failed!
Expression: _CtrlIsValidHeapPointer(pUserData)
简而言之,我需要一个shared_ptr
到service_
(这是一个假对象)传递给MyClass
构造函数,我需要一个非指针{{1功能。我怎样才能让它正常工作?
更新
尝试动态分配SomeServiceFake以获取shared_ptr,然后在EXPECT_CALL
上使用*运算符,这让我“进一步”但现在我收到以下错误:
service_
更新2
使用error : this mock object
(used in test MyClassTests.DoIt_DoesNotMeetCriteria_DoesNotPerformAction)
should be deleted but never is. Its address is @009BBA68.
1>EXEC : error : 1 leaked mock object found at program exit.
所以我现在可以解决这个问题。希望我会得到答案。
答案 0 :(得分:7)
更像这样定义您的测试类:
class MyClassTests : public ::testing::Test {
public:
MyClassTests():
service_(new SomeServiceFake), myClass_(new MyClass(service_)) {}
protected:
std::shared_ptr<SomeServiceFake> service_;
std::shared_ptr<MyClass> myClass_;
};
和你的考试:
EXPECT_CALL(*service_, MeetsCriteria(_))
.WillRepeatedly(Return(false));
EXPECT_CALL(*service_, PerformAction(_))
.Times(0);
答案 1 :(得分:2)
这与测试框架无关。正如您自己所说,您正在从堆栈分配的对象(即具有自动生存期的对象)创建shared_ptr。这根本不符合逻辑。共享指针通常是根据new
的结果创建的。如果将自定义Deleter作为第二个参数传递给shared_ptr构造函数,则可以使其工作,但最好的方法是使用new创建对象。