我是一个学生,我正在学习领域驱动的设计。从我的阅读中,一个重要的部分是从类中移除getter和setter(从而使该类的实现保持私有)。我的问题是你如何为这门课做单元测试。
请考虑以下示例:
public class Account {
private Money money;
public void withdraw(float money){
this.money.subtract(money);
}
}
public class Money {
private float value;
private Currency currency;
public void subtract(float money) {
this.value -= money;
}
}我如何测试帐户类,或事件的货币类?如果出现错误,我可以抛出一个异常并配置测试,以便它期望该异常。那幸福之路呢?如何检查方法调用后的值是否是正确的值?
发布于 2017-09-09 04:22:38
我如何测试帐户类,或事件的货币类?
这个问题有几种不同的答案。
最直截了当的答案是,我们使用领域模型来管理数据模型的更改。Money.value来自某个地方,调用Account.withdraw的动机是在其源中更改该特定值。
Given: an initial state for the source
When: the domain model is directed to perform a behavior
Then: the change to the source satisfies the specification对于资源的状态,请考虑DTO;该状态的表示形式旨在跨越进程边界。
同样的想法也表达了另一种方式:必须有一种将数据注入域邮件并将其提取出来的方法。有一些东西可以理解如何获取原始输入并将它们转换为值对象;与wise一样,一定有一些东西能够理解如何获取值对象并将它们转换回原语输出。
如果您熟悉TDD,那么在设计一个新类时会看到这种方法--考虑一下保龄球游戏卡塔。测试模型作为int输入滚动,并将分数建模为int输出。当我们开始在模型中明确这些概念时,我们编写代码将原语转换为显式概念,反之亦然。
一个略有不同的变化;我们通常对域模型所做的是确保对记录簿的更改满足某些业务不变。因此,我们认为,在将“记录书”传递给模型时,让模型进行修改,然后检查记录书来验证变化。
// Given
Model m = Model.from(bookOfRecord);
Command c = Command.from(message);
// When
{
m.runCommand(c);
}
// Then
assert specification.isSatisfiedBy(bookOfRecord);格雷格·杨( Greg )提出了一个不同的答案,当时他引入了概率kata,“在微积分中测试模型”。
例如,在您的示例中,域模型使用浮点值来跟踪货币的当前状态,这是一个实现细节。随着您的模型在舍入规则方面变得更加复杂,这种情况可能会发生变化。
这种改变不应该破坏你所有的测试。
模型的“状态”应该是一个黑匣子;测试应该关注的不是模型最终处于预期的“状态”,而是模型产生对查询的正确响应。
其中一些查询可能很简单,比如“模型内部是否一致?”
https://softwareengineering.stackexchange.com/questions/357064
复制相似问题