我有一个测试可以很好地使用原始指针,但我无法让它与 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
构造函数,我需要EXPECT_CALL
函数的非指针。我怎样才能让它正常工作?
更新
尝试动态分配 SomeServiceFake 以获取 shared_ptr,然后在 service_
上使用 * 运算符,这让我“更进一步”,但现在我收到以下错误:
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.
更新 2
使用 Mock::AllowLeak(service_.get());
这样我就可以暂时解决这个问题。希望我能得到答案。
最佳答案
更像这样定义你的测试类:
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);
关于c++ - 将 googlemock EXPECT_CALL 与 shared_ptr 一起使用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10341757/