c++ - 将 googlemock EXPECT_CALL 与 shared_ptr 一起使用?

标签 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 构造函数,我需要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/

相关文章:

c++ - 什么时候初始化 `thread_local` 全局变量?

c++ - 使用复合数据结构计算最近点

C++shared_ptr序列化

c++ - 使用 make_shared<std::thread> 创建 shared_ptr<std::thread> 的实例

c++ - 如何在 Visual Studio 中使用 GoogleMock?

c++ - 重载的赋值运算符不起作用

c++ - 英特尔® 图形技术的卸载支持已在英特尔 C++ 编译器 19.0 测试版中移除

c++ - 使用共享指针的函数重载

C++ Gmock - 使用 shared_ptr <FactoryClass> 的测试函数

c++ - 有没有办法模拟 QSqlQuery?