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

dan*_*ani 5 c++ googletest googlemock c++17

我在某个类中注入依赖项。此类存储与 an 的依赖关系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
}
Run Code Online (Sandbox Code Playgroud)

Jar*_*d42 10

*(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
Run Code Online (Sandbox Code Playgroud)

  • 这与 Times() 一起工作吗?即: `EXPECT_CALL(*dep, plusOne(_)).Times(1)` 似乎谷歌模拟了解它是否被调用,但不知道它被调用的实际次数...我知道这是一个旧线程。为复活而遗憾。 (2认同)