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

时间:2015-04-14 00:05:53

标签: 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);
     }
};

我与我的团队中的一位同事就此进行了一次小小的辩论。我认为如果Bar对象是生产中Foo对象的唯一用户,那么unique_ptr是正确的指针类型。他认为,因为我们必须在测试用例中将ref存储到原始指针,这实际上是共享语义,而shared_ptr是正确的指针。

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

0 个答案:

没有答案