Answers:
从图中判断,Product是一个哑数据类,没有测试功能。因此,我将开始为Line编写测试(并实现TDD样式),然后再按Order编写测试,并进行相关性测试。通常,在开始对更高级别的课程进行工作之前,先对较低级别的课程进行测试是明智的(即,取决于较低级别的课程)。这样可以更有效地捕获错误。
是否需要使用模拟对象取决于测试类的实际依赖关系。如果这些是简单的类,您可以轻松地实例化和设置测试所需的任何所需数据/状态,则无需模拟。(这里的示例设计似乎是这种情况。)但是,如果任何依赖项都难以初始化/自身具有广泛的依赖项/具有不良的副作用/依赖于外部资源(例如DB),那么就有意义改为使用模拟对象。
“ TDD主要是一种设计技术,其副作用是确保对源代码进行全面的单元测试” – Scott W. Ambler
这个想法是通过编写单元测试来找到设计。就您而言,似乎您已经拥有了设计,这有点违背了TDD的目的(假设您的设计是最终的)。
关于嘲笑。如果要模拟,建议您在编写Line的测试时模拟Product,在测试Order时模拟Line。但这在这里可能会过分杀伤力。我个人尝试尽可能地限制模拟,并使用它来解耦对外部类(例如数据库实例)的依赖。