我正在处理一个项目,其中有大量的外部服务消息传递。一个略微夸张但比较准确的描述是应用程序必须向Flicker API、Facebook API和Netflix API发送消息。
为了支持断开连接的情况、日志记录、开发人员易用性、配置等方面的需求,我尝试使用了一种广泛使用泛型和表达式树的方法。最终的结果如下:
Messenger<NetflixApi>.SendCustom( netflix => netflix.RecommendMovie("my message"));
总体来说,我对最终结果感到满意,但我的一个担忧是,在测试和断开的场景中,我可能犯了一个错误或忽视了某个设计原则。
在测试期间,无论是自动化、单元还是基于人类的测试,我都使用了一个对象工厂,最初使用 DI 在“实时模式”下执行正确的操作,并使用 Mocks 提供一种类似于无菌信使的东西,在测试模式下不做任何事情。
我只看到或读到过 Mocks 在纯 TDD 模式下使用,并且没有被用作一种愚笨的对象。我看到的方法都是围绕着存根或模拟 HTTP 通信功能来进行的,而所有我使用的 API 都依赖于这些功能。
我的主要担忧是,对于我希望连接到的所有不同服务,我最终会不得不进行大量的细粒度工作来替换特定的 HTTP 实现,如果我使用存根方法,我将为每个服务(IService、ConcreteService、StubService)有 3 个类,当实现新方法或更改任何内容时,维护这些类将是真正的痛苦。
在当前的实现中,我使用 Mocks 几乎能够免费获得“无菌模式”,而无需额外实施任何内容来符合某个测试原则。
问题是,我有什么遗漏吗?我使用 Mocks 是在更方便的方式中违反了设计原则吗?
有人可以就如何在许多不同的外部服务中获得无菌模式提供任何建议吗,而不需要跳过很多障碍?
这个问题有意义吗?
感谢所有的回答。
编辑 #1:
我在原始问题中没有表述清楚。任何空值或模拟对象都仅用于开发/调试/测试环境。在生产中发送这些消息的代码将是它们的实际实现。
我投票支持每个人,因为似乎有很多不同的解决方法,我将探索每一种方法。
请不要认为这个问题已经得到答复,我会非常感激尽可能多的建议。