生のポインターで正常に機能するテストがありますが、で機能させるのに問題があり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
to 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());
て、今のところこの問題を回避できます。うまくいけば、私は答えを得るでしょう。