使用粉刺模式的模拟类
Mocking classes that use Pimpl pattern
假设我创建了一个库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_;
};
需要使用痘痘图案。后来,我意识到我的公共类Book的用户在为自己的代码编写单元测试时可能想要模仿它。现在他们需要影子Book
类,因为它没有虚拟方法。
所以,我想让Book
类容易被嘲笑。为此,我们有了虚拟化或模板化(奇怪的是循环设计模式或高依赖注入)。在痘痘的情况下,每种方法的优势是什么?对我来说,在实现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_;
};
Pimpl是100%关于实现的,它根本不影响接口。
mock是关于保持接口和交换实现。
没有重叠。对于模拟,你所模拟的类是如何实现的是没有区别的。
你可以尝试做一些有趣的事情,比如使Implementation
类虚拟。对于维护开发人员来说,这将是相当令人惊讶和意想不到的,所以我强烈建议不要这样做。像对待其他类一样对待粉刺类
相关文章:
- 具有奇怪重复模板模式的派生类中的成员变量已损坏
- 派生类是否可以在抽象工厂设计模式中具有数据成员
- 简化使用 CRTP 模式的类的声明
- 在谷歌测试中创建模拟类的向量
- 将模拟类添加到 stl 容器
- 谷歌模拟类似乎没有实现
- 如何使用(GoogleMock)模拟类作为模板参数
- googlemock:无法创建模拟类的对象
- 如何使用 gmock 模拟类中的模板方法
- 没有虚拟方法的模拟类
- 使用 CRTP 模拟类
- 如何用模板方法(c++)模拟类中的多态性
- GMOCK 模拟类不继承任何类
- 允许模拟类从最终类继承
- 为gmock自动生成模拟类
- 不同的类模式:条件构造函数/方法与继承
- 使用粉刺模式的模拟类
- GMock:如何返回模拟类变量作为返回值
- 模板化模拟类中缺少MOCK_METHODx() 定义'typename'
- 如何使用运算符[]创建模拟类