在单元测试中访问已经移到构造函数中的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));
}
1条答案
按热度按时间z4iuyo4d1#
通过定期检查,您可以: