模拟使用Pimpl模式的类

时间:2016-10-18 09:49:45

标签: c++ api mocking virtual pimpl-idiom

假设我创建了一个库libFoo,它公开了一个API这个类

class Book
{
    public:

    Book(string const& title, string const& author);
    string const& title() const;
    string const& author() const;

    private:
    struct Implementation;
    std::shared_ptr<Implementation> impl_;
};

需要使用pimpl模式。后来,我意识到我的公共类Book的用户可能想要在为自己的代码编写单元测试时模拟它。现在他们需要影子Book类,因为它没有虚拟方法。

所以,我想让Book类容易模拟。为此,我们有虚拟化或模板化(奇怪的循环设计模式或hi-perf依赖注入)。 在Pimpl模式的背景下,每个人的优势是什么? 对我来说,在实现Pimpl模式的类上使用虚方法看起来有点不对。另一方面,libFoo的公共API的虚拟化将使库具有最小变化的可模拟性。如果我选择虚拟化和Pimpl,会有什么“陷阱”等着我?

class Book
{
    public:

    Book(string const& title, string const& author);
    virtual string const& title() const;
    virtual string const& author() const;

    private:
    struct Implementation;
    std::shared_ptr<Implementation> impl_;
};

1 个答案:

答案 0 :(得分:2)

Pimpl 100%是关于实施的,它根本不会影响界面。

模拟是关于保持接口和交换实现。

没有重叠。对于模拟,你实现的类是如何实现的,没有区别。

您可以尝试做一些有趣的事情,例如将Implementation类设为虚拟。这对于维护开发人员来说是非常令人惊讶和意外的,所以我强烈建议不要这样做。像对待其他课程一样对待pimpl课程。