在TDD中模拟值

在GOOS书中。 它被告知不要嘲笑价值观 ,这让我感到困惑。 这是否意味着价值观没有任何行为?

我不太了解价值对象,但AFAIK价值对象是那些不可变的。 在决定何时创建值对象时是否有任何启发式方法?

并非所有不可变对象都是值对象。 顺便说一下,在设计时,请考虑理想对象只有不可变字段和无参数方法。

关于启发式,一个有效的方法可以考虑如何使用对象:如果你构建一个实例,调用一些方法,然后完成它(或将它存储在一个字段中)可能它不会是一个值对象。 相反,如果你将对象保存在某些数据结构中并比较它们(使用.equals() ),你可能会有一个值对象 。 对于将用于键入Map的对象尤其如此

值对象本身应该自动测试(并且测试通常是阅读和编写的乐趣,因为它很简单)但是模拟它们没有意义:模拟接口的主要实际原因是实现类

  • 通常很难建立(需要很多合作者)
  • 运行起来很昂贵(访问网络,文件系统,…)。

既不适用于价值对象。

引用链接的博客post :

当一堂课不值得嘲笑时,有几种启发式方法。 首先,它只有访问器或简单的方法来处理它所拥有的值,它没有任何有趣的行为。 其次,你不能想到除了VideoImpl之外的类或一些这样模糊的术语的有意义的名称。

在标题为“不要模拟值对象”的部分的上下文中,第一点的含义是值对象没有有趣的行为。