TDD 中的模拟值

Mocking values in TDD

在书 GOOS. It is told not to mock values 中,这让我很困惑。这是否意味着值没有任何行为?

我对值对象了解不多,但据我所知,值对象是不可变的。是否有任何关于决定何时创建值对象的启发式方法?

并非所有不可变对象都是值对象。顺便说一句,在设计的时候,考虑到理想对象只有不可变字段和no-arg方法。

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

的对象尤其如此

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

  • 通常很难构建(需要很多合作者)
  • 对 运行(访问网络、文件系统等)来说很昂贵。

两者都不适用于值对象。

引用linked blog post

There are a couple of heuristics for when a class is not worth mocking. First, it has only accessors or simple methods that act on values it holds, it doesn't have any interesting behaviour. Second, you can't think of a meaningful name for the class other than VideoImpl or some such vague term.

在标题为 "Don't mock value objects" 的部分的上下文中,第一点的含义是值 objects 没有有趣的行为。