我的问题在于,我注意到一种模式,在多个地方概念上重复了逻辑。例如,我需要检测数据库中不存在的值,所以在这种情况下,我可能会从该方法返回null。因此,我有一个数据库访问类,它处理数据库交互,并适当地返回null。然后,我有业务逻辑类,从模拟中接收null,然后测试如果该值为null时应该如何操作。
现在,如果将来需要更改该行为并且不再返回null,比如说因为状态变得更加复杂,那么我需要返回一个对象,该对象报告值不存在和一些附加的数据库事实。
现在,如果我更改数据库类的行为,不再在该情况下返回null,则业务逻辑类仍然似乎可以正常工作,除非有人记得耦合或正确地遵循方法的用法,否则只有在QA中才能发现错误。
我觉得我错过了什么,必须有更好的方法来避免这种概念上的重复,或者至少将其进行测试,以便如果更改没有传播,则单元测试失败。
有什么建议吗?
更新:
让我尝试澄清我的问题。我在考虑代码随时间的演变,如何确保测试通过Mock测试的类和Mock所代表的实际类的实现之间的集成不会中断。
例如,我刚刚遇到了一个情况,其中一个最初创建的方法没有期望null值,因此这不是对真实对象的测试。然后,使用该类(通过模拟测试)的用户被增强以在某些情况下传递null作为参数。在集成时,这会导致错误,因为真实类没有测试null。现在,在最初构建这些类时,这不是一个大问题,因为您正在构建两端的测试,但是如果设计需要两个月后发展,当您倾向于忘记细节时,如何测试这两组对象之间的交互(通过模拟测试的对象与实际实现)?
潜在的问题似乎是重复的(违反DRY原则),期望实际上保存在两个地方,尽管关系是概念性的,但实际上没有重复代码。
没错,这正是我正在做的事情(除了在通过DBUnit测试并在测试期间与数据库交互的类中还有一些进一步的与DB交互,但这是同样的想法)。现在,假设我们需要修改数据库行为以使结果不同。使用模拟测试的测试将继续通过,除非1)有人记得或2)它在集成中出现故障。因此,数据库存储过程返回值(例如)在模拟测试数据中被复制。现在让我困扰的是重复的逻辑,这是DRY的微妙违反。可能只有这样(毕竟有集成测试的原因),但我感觉我缺少了什么。
【编辑开始提供赏金】
阅读与Aaron的互动可以达到问题的要点,但我真正寻求的是如何避免或管理明显的重复,并使真实类的行为变化显示为与模拟进行交互的单元测试中的某些断点。显然,这不会自动发生,但可能有一种正确设计场景的方法。
【编辑颁发赏金】
感谢所有花时间回答问题的人。获胜者教给我一些关于如何考虑在两个层之间传递数据的新思路,并首先得出了答案。