c++ - 使用 Pimpl 模式的模拟类

标签 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 模式。后来,我意识到我的公共(public)类 Book 的用户可能想在为自己的代码编写单元测试时模拟它。现在他们需要隐藏 Book 类,因为它没有虚拟方法。

因此,我想让 Book 类易于模拟。为此,我们有虚拟化或模板化(奇怪的循环设计模式或高性能依赖注入(inject))。 在 Pimpl 模式的上下文中,每个模式的优势是什么? 对我来说,在实现 Pimpl 模式的类上使用虚方法看起来有点不对。另一方面,libFoo 的公共(public) 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_;
};

最佳答案

Pimpl 是 100% 的实现,它根本不影响界面。

Mocking 是关于保留接口(interface)和交换实现。

没有重叠。对于模拟,您模拟的类的实现方式没有区别。


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

关于c++ - 使用 Pimpl 模式的模拟类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40104958/

相关文章:

c# - 将数据从 dotnetcore api 发布到 .net api 不起作用

java - Mockito ClassCastException - 无法转换模拟

c++ - 在不编辑生产代码的情况下在 C++ 中模拟非虚拟方法?

java - 如何 JUnit 测试我的模拟方法是否使用我想要的参数(不仅仅是 id,而是深度相等匹配器)调用?

c++ - 如何判断两个源文件是否生成功能相同的代码?

c++ - 子序列和模的乘积

c++ - 为什么我可以在 constexpr 函数中修改 const_cast-ed 对象?

c++ - 为什么我不能使用 strerror?

api - 通过 angularJs 和 $http.get 将凭据传递给服务堆栈 rest api

ios - 如何使用 IOS、Xcode 和 Swift 将 Moltin 更新到 v2?