使用googlemock EXPECT_CALL和shared_ptr?

时间:2012-04-26 21:34:48

标签: c++ shared-ptr googlemock

我有一个适用于原始指针的测试,但我无法使用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_ptrservice_(这是一个假对象)传递给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. 所以我现在可以解决这个问题。希望我会得到答案。

2 个答案:

答案 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创建对象。