c++ 访问已在构造函数中移动的单元测试中的unique_ptr

g6ll5ycj  于 2022-12-24  发布在  其他
关注(0)|答案(1)|浏览(90)

在单元测试中访问已经移到构造函数中的unique_ptr的方法是什么?我想在unique_ptr旁边创建一个shared_ptr,并在单元测试中访问shared_ptr,但我担心这也是UB。

|struct Base
{
    virtual int bar() = 0;
};

struct B : public Base
{
    MOCK_METHOD(int, bar, (), (override));
};

class A
{
   std::unique_ptr<B> _ptrB;

   public:
   A(std::unique_ptr<B> ptr) : _ptrB(std::move(ptr))
   {
      // A takes ownership of Utest::ptrB now
   }
};

struct Utest
{ 
  Utest()
  {
    ptrA = std::make_shared<A>(std::move(ptrB));
  }

  std::shared_ptr<A> ptrA;
  std::unique_ptr<B> ptrB = std::make_unique<B>();
};

TEST_F(Utest, testA)
{
    // can't access ptrB since it's been moved
    EXPECT_CALL(*ptrB, bar()).WillOnce(Return(100));  // error: Process finished with exit code 11
}
    • 编辑:**

我能够用这个解决方案来解决这个问题,在移动私有成员A::_ptrB后使用它,并将其向下转换为B类型,然后在EXPECT_CALL中使用它。
但问题是:我可以把向下转换部分移到构造函数中,这样我就不必在所有其他单元测试中"重复"这些步骤了吗?或者有更好的方法吗?

struct Base
{
    virtual int bar() = 0;
};

struct BaseMock : public Base
{
    MOCK_METHOD(int, bar, (), (override));
};

class A
{
   std::unique_ptr<BaseMock> _ptrB;
   friend class Utest;

   public:
   A(std::unique_ptr<BaseMock> ptr) : _ptrB(std::move(ptr))
   {
      // A takes ownership of Utest::ptrB now
   }
   
};

struct Utest
{ 
  Utest()
  {
    ptrA = std::make_shared<A>(std::move(ptrB));
  }

  std::shared_ptr<A> ptrA;
  std::unique_ptr<BaseMock> ptrB = std::make_unique<BaseMock>();
};

TEST_F(Utest, testA)
{
    BaseMock* ptr = dynamic_cast<BaseMock*>(_ptrB.get());
    EXPECT_CALL(*ptr, bar()).WillOnce(Return(100)); 
}
z4iuyo4d

z4iuyo4d1#

通过定期检查,您可以:

TEST(testA)
{
    std::unique_ptr<B> ptrB = std::make_unique<B>();
    EXPECT_CALL(*ptrB, bar()).WillOnce(Return(100));
    A a(std::move(ptrB));
    // Do test with `a`
}

相关问题