unique_ptr 或 shared_ptr 用于带有单元测试的依赖注入类

Kev*_*vin 5 c++ unit-testing dependency-injection

unique_ptr 或 shared_ptr 更适合在使用依赖项注入并对不与其他实例共享的对象进行单元测试的类中使用。

例子:

class IFoo {
public:
    virtual void DoFoo()=0;
};

class RealFoo : public IFoo {
public:
    virtual void DoFoo() { /* ... */ }
};

class FakeFoo : public IFoo {
public:
    virtual void DoFoo() { DoFooCalled = true; }

    bool DoFooCalled;
};

class Bar {
public:
    explicit Bar(std::unique_ptr<IFoo> foo) : m_foo(std::move(foo)) { }

    void DoBar() {
        m_foo->DoFoo();
    }

private:
    std::unique_ptr<IFoo> m_foo;
};

class BarTest : public TestRunner {
public:
    void DoBarCallsDoFoo() {
        FakeFoo* rawFakeFoo = new FakeFoo(true);
        std::unique_ptr<FakeFoo> fakeFooPtr(rawFakeFoo);

        Bar bar(std::move(fakeFooPtr));

        bar.DoBar();

        Assert(rawFakeFoo->DoFooCalled);
     }
};
Run Code Online (Sandbox Code Playgroud)

我和我团队的一位同事就这个问题进行了一场小辩论。我认为如果 Bar 对象是生产中 Foo 对象的唯一用户,那么 unique_ptr 是正确的指针类型。他认为,因为我们必须在测试用例中存储对原始指针的引用,所以这确实是共享语义,并且共享指针是正确的指针。

在这种情况下哪种指针类型是正确的?