TDD 中的模拟值
Mocking values in TDD
在书 GOOS. It is told not to mock values 中,这让我很困惑。这是否意味着值没有任何行为?
我对值对象了解不多,但据我所知,值对象是不可变的。是否有任何关于决定何时创建值对象的启发式方法?
并非所有不可变对象都是值对象。顺便说一句,在设计的时候,考虑到理想对象只有不可变字段和no-arg方法。
关于启发式,一个有效的方法可以考虑如何使用对象:如果你构建一个实例,调用一些方法然后完成它(或将它存储在一个字段中)可能不会一个值对象。相反,如果您将对象保存在某些数据结构中并比较它们(与 .equals()
),则很可能您有一个 值对象 。对于将用于键入 Map
s
的对象尤其如此
值对象本身应该是 automatic-tested(测试通常很容易阅读和编写,因为它们很简单)但是模拟它们没有意义:模拟接口的主要实际原因是实现 类
- 通常很难构建(需要很多合作者)
- 对 运行(访问网络、文件系统等)来说很昂贵。
两者都不适用于值对象。
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 没有有趣的行为。
在书 GOOS. It is told not to mock values 中,这让我很困惑。这是否意味着值没有任何行为?
我对值对象了解不多,但据我所知,值对象是不可变的。是否有任何关于决定何时创建值对象的启发式方法?
并非所有不可变对象都是值对象。顺便说一句,在设计的时候,考虑到理想对象只有不可变字段和no-arg方法。
关于启发式,一个有效的方法可以考虑如何使用对象:如果你构建一个实例,调用一些方法然后完成它(或将它存储在一个字段中)可能不会一个值对象。相反,如果您将对象保存在某些数据结构中并比较它们(与 .equals()
),则很可能您有一个 值对象 。对于将用于键入 Map
s
值对象本身应该是 automatic-tested(测试通常很容易阅读和编写,因为它们很简单)但是模拟它们没有意义:模拟接口的主要实际原因是实现 类
- 通常很难构建(需要很多合作者)
- 对 运行(访问网络、文件系统等)来说很昂贵。
两者都不适用于值对象。
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 没有有趣的行为。