[英]Unit testing requires many interfaces?
我目前正在开发我的第一个使用 TDD 和单元测试的项目。 我正在使用googletest和googlemock库在 C++ 中写作。 该项目需要许多具有特定功能的小类。 我主要在构造函数中使用依赖注入。 根据这个:
注入构造函数的依赖项是单元测试中 mocking 的良好候选者。 在 C++ 中有两种方法可以做到这一点:
你如何处理这种情况? 您喜欢多接口(N 个类需要 N 个接口)还是从 Base class 派生?
像这样的问题没有单一的最佳答案,但我可以分享我团队的一些经验。 我们使用的方法如下。 该项目被分成我们内部称为“模块”的东西。 这些基本上只是 C++ 类,但它们的特别之处在于它们是项目中最大/最重要的类。 这些类的接口暴露给其他模块(这是通过 CMake 配置的),因此它们可以相互使用。 每个模块都是一个小的 static 库,在该库中还有额外的 C++ 类,这些类仅用于完成包含模块的功能,但与其他模块无关。 这些被配置为模块私有(再次通过 CMake),其他模块不知道这些类。
因此,在简要解释了我们项目的组织方式之后,回到您的问题:
对于需要暴露给其他模块的模块的主要类(通常是1-3个),我们创建了一个接口(纯虚拟类),并附有详细的文档(精确的合同详细说明了客户端应该如何使用class,时序图,详细所有方法的文档等)。 然后我们有一个从这个接口继承的模拟,它暴露给其他模块,还有一个实现 class(你称之为生产类),它也继承了模块,但它是私有的(其他类不需要实现细节,只需要了解如何创建和使用接口的实例)。
对于每个模块中私有的其他类,我们只需在 Production class 中创建虚拟方法以使事情更简单,并且它们的模拟只是从 Production class 继承。 顺便说一句,您的默认构造函数问题应该可以通过在生产 class 中声明一个受保护的默认构造函数来轻松解决?
在我看来,这在避免过多的样板代码(通过为每个类都有一个接口)和为项目中最重要的类提供漂亮、干净和精确定义的接口之间提供了一个很好的平衡。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.