领域实现建模关注的并非是如何进行代码实现,而是如何验证代码实现的正确性,保证实现的高质量。
7.4.1 领域模型与测试金字塔领域模型中的服务包括了应用服务、领域服务、领域行为和端口。其中通过Provider(面向服务行为)、Resource(面向服务资源)、Subscriber(面向事件)、Controller(面向视图模型)对外进行暴露的,我们称为远程服务。
领域模型中的服务与测试金字塔的关系如下图所示。
领域实现建模提倡的是测试驱动开发的编程思想,即要求开发者在进行逻辑实现前,优先进行测试用例的编写,站在调用者角度而非实现者角度去思考接口。
在上述测试金字塔中,开发者需要关注的是单元测试(不依赖任何外部资源的测试就是单元测试)。在领域设计建模阶段,我们对业务服务/应用服务进行分解,定义出了领域行为和领域服务。对于领域行为,由于其不依赖外部资源,因此我们可以直接编写单元测试;而对于领域服务,其可能会通过端口访问外部资源,此时我们需要对端口进行mock,以隔离外部资源对领域逻辑验证的干扰。特别地,单元测试一定要覆盖所有对业务规则的验证,这是保证领域行为和领域服务正确性的基础。
单元测试编码规范:
- 测试类的命名应与被测试类保持一致,为“被测类名称 Test后缀”。
- 测试方法表达业务或业务规则为目的。
- 测试方法体遵循Given-When-Then模式。Given: 为要测试的方法提供准备,包括创建被测试对象,为调用方法准备输入参数实参等;When: 调用被测试的方法,遵循单一职责原则,在一个测试方法的When部分,应该只有一条语句对被测方法进行调用;Then: 对被测方法调用后的结果进行预期验证。