首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >当您没有getter和setter时进行单元测试

当您没有getter和setter时进行单元测试
EN

Software Engineering用户
提问于 2017-09-08 20:37:48
回答 1查看 4.2K关注 0票数 1

我是一个学生,我正在学习领域驱动的设计。从我的阅读中,一个重要的部分是从类中移除getter和setter(从而使该类的实现保持私有)。我的问题是你如何为这门课做单元测试。

请考虑以下示例:

代码语言:javascript
运行
复制
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;  
    }
}

我如何测试帐户类,或事件的货币类?如果出现错误,我可以抛出一个异常并配置测试,以便它期望该异常。那幸福之路呢?如何检查方法调用后的值是否是正确的值?

EN

回答 1

Software Engineering用户

发布于 2017-09-09 04:22:38

我如何测试帐户类,或事件的货币类?

这个问题有几种不同的答案。

最直截了当的答案是,我们使用领域模型来管理数据模型的更改。Money.value来自某个地方,调用Account.withdraw的动机是在其源中更改该特定值。

代码语言:javascript
运行
复制
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输出。当我们开始在模型中明确这些概念时,我们编写代码将原语转换为显式概念,反之亦然。

一个略有不同的变化;我们通常对域模型所做的是确保对记录簿的更改满足某些业务不变。因此,我们认为,在将“记录书”传递给模型时,让模型进行修改,然后检查记录书来验证变化。

代码语言:javascript
运行
复制
// Given
Model m = Model.from(bookOfRecord);
Command c = Command.from(message);

// When
{
    m.runCommand(c);
}

// Then
assert specification.isSatisfiedBy(bookOfRecord);

格雷格·杨( Greg )提出了一个不同的答案,当时他引入了概率kata,“在微积分中测试模型”。

例如,在您的示例中,域模型使用浮点值来跟踪货币的当前状态,这是一个实现细节。随着您的模型在舍入规则方面变得更加复杂,这种情况可能会发生变化。

这种改变不应该破坏你所有的测试。

模型的“状态”应该是一个黑匣子;测试应该关注的不是模型最终处于预期的“状态”,而是模型产生对查询的正确响应。

其中一些查询可能很简单,比如“模型内部是否一致?”

票数 1
EN
页面原文内容由Software Engineering提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://softwareengineering.stackexchange.com/questions/357064

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档