如何在gmock中模拟存储为unique_ptr的对象?

问题描述 投票:1回答:1

我在某个类中注入了一个依赖项。此类使用std::unique_ptr存储依赖项,因此是该对象的唯一所有者。

在此依赖项中模拟方法的正确方法是什么?我目前的解决方案是在交出所有权之前从unique_ptr获取一个原始指针。虽然这有效,但我认为还有更好的方法。这些是什么?

class Dependency
{
public:
    virtual int plusOne(int x) {return x+1;}
};

class Dependency_Mock : public Dependency
{
public:
    MOCK_METHOD1(plusOne, int(int));
};

class SomeClass
{
public:
    void inject(std::unique_ptr<Dependency> dep) {dependency = std::move(dep);}
    int execute(int x) {return dependency->plusOne(x);}
private:
    std::unique_ptr<Dependency> dependency;
};


TEST(SomeClassTest, executeTestWithMock)
{
    SomeClass some;
    auto dep = std::make_unique<Dependency_Mock>();
    auto& dep_ref = *(dep.get()); // This is kind of ugly.
    some.inject(std::move(dep));

    EXPECT_CALL( dep_ref , plusOne(_))
            .WillOnce(Return(5));

    EXPECT_EQ(some.execute(5), 5); // execute
}
c++ c++17 googletest gmock
1个回答
2
投票

*(dep.get())可以直接替换*dep

然后,您可以在调用expect之前移动它:

auto dep = std::make_unique<Dependency_Mock>();
EXPECT_CALL(*dep, plusOne(_)).WillOnce(Return(5));
SomeClass some;
some.inject(std::move(dep));

EXPECT_EQ(some.execute(5), 5); // execute
© www.soinside.com 2019 - 2024. All rights reserved.