tdd java_Java TDD简介–第2部分

tdd java

再次问好! 在上一篇博客文章中,我在没有紧密引用Java的情况下总体上解释了TDD理论 ,但是在这一部分中,我们开始进行TDD实践。 我们的目标是遍历TDD的所有阶段:从需求分析到测试代码的重构。 我们将在具有Java,JUnit和“ fake”需求的示例中完成所有这些工作。

需求分析

假设我们需要在一个虚构的应用程序中创建一个新功能。 以下用户故事描述了此功能:

作为用户,我希望能够创建一个帐户。 该帐户应包含ID,状态(有效/无效),区域和余额。 余额属性不能为负。 默认情况下,帐户应处于活动状态,在#1区域中且余额为0.00。

这就是抽象开发团队中常见的用户故事。 在实践中,需要在前端开发人员和后端开发人员之间分离功能。 我们还假设团队中已经存在一些代码约定等。

因此,在将功能分配给我作为后端开发人员之后,我需要澄清所有我不清楚的问题。 例如, 区域属性的目的是什么?

答:在应用程序的交易中使用区域。 根据区域的不同,我们会从帐户收取不同的费用。 目前,我们仅计划3个区域。

好。 现在一切都清楚了,我们可以开始TDD了。

Java TDD:首次测试

这是我们在项目中需要具备的依赖项:

<dependencies><dependency><groupId>org.apache.commons</groupId><artifactId>commons-lang3</artifactId><version>3.4</version></dependency><dependency><groupId>org.javamoney</groupId><artifactId>moneta</artifactId><version>1.0</version></dependency><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.12</version></dependency><dependency><groupId>org.hamcrest</groupId><artifactId>hamcrest-library</artifactId><version>1.3</version></dependency></dependencies>

我使用Maven,但是您也可以使用Gradle或任何其他依赖项管理工具。 最后,我需要执行第一个实际的开发步骤:创建空的Account类和相应的测试类。 那是Intellij IDEA中的项目结构:

TDD项目结构

注意Account类的位置和AccountTest类。 它们具有相同的软件包名称,但目录不同。 那是某种约定。

回顾用户故事,我想创建以下单元测试:

  1. 默认帐户创建
  2. 自定义帐户创建
  3. 检查负余额情况

以下是测试方法:

package com.model;import org.javamoney.moneta.Money;
import org.junit.Test;import static org.hamcrest.MatcherAssert.assertThat;
import static org.hamcrest.Matchers.*;public class AccountTest {@Testpublic void defaultAccountCreationTest() {Account account = new Account();assertThat(account.getId().length(), equalTo(6));assertThat(account.getStatus(), equalTo(true));assertThat(account.getZone(), equalTo(Account.Zone.ZONE_1));assertThat(account.getBalance(), equalTo(Money.of(0.00, "USD")));}@Testpublic void customAccountCreationTest() {Account account = new Account(false, Account.Zone.ZONE_3, 125.95);assertThat(account.getId().length(), equalTo(6));assertThat(account.getStatus(), equalTo(false));assertThat(account.getZone(), equalTo(Account.Zone.ZONE_3));assertThat(account.getBalance(), equalTo(Money.of(125.95, "USD")));}@Test(expected = IllegalArgumentException.class)public void negativeBalanceTest() {Account account = new Account(false, Account.Zone.ZONE_3, -200);}}

测试完成后,就该看看我们在Account类中得到了什么。 因为在单元测试开发中,我还在Account类中创建了所需方法,构造函数和属性的伪声明。

业务逻辑实施

单元测试完成后,我们需要在Account类中看到以下内容:

package com.model;import org.javamoney.moneta.Money;public class Account {private String id;private boolean status;private Zone zone;private Money balance;public Account() {}public Account(boolean status, Zone zone, double balance) {}public enum Zone {ZONE_1, ZONE_2, ZONE_3}public String getId() {return id;}public boolean getStatus() {return status;}public Zone getZone() {return zone;}public Money getBalance() {return balance;}}

如上所示,从功能的角度来看, Account类并不理想。 构造函数没有用,所有属性均未初始化。 但是测试驱动的开发意味着在单元测试创​​建阶段会出现这种情况。

当我们为Account类运行单元测试时,将得到“红色”结果。 因此,使它们绿色的方法是从defaultAccountCreationTest()开始 。 在此测试的上下文中,我们必须更新Account类。 更改很小,但是更改之后,单元测试变为绿色。

package com.model;import org.apache.commons.lang3.RandomStringUtils;
import org.javamoney.moneta.Money;public class Account {private String id = RandomStringUtils.randomAlphanumeric(6);private boolean status = true;private Zone zone = Zone.ZONE_1;private Money balance = Money.of(0.00, "USD");public Account() {}
//next code is omitted, it was not affected by the first changes

您可以运行更新的AccountTest类。 运行的结果是:一个测试通过,两个失败。
然后,我们需要对每个单元测试重复此操作,直到它们全部变为“绿色”为止。

那是Account类的最终版本:

package com.model;import org.apache.commons.lang3.RandomStringUtils;
import org.javamoney.moneta.Money;public class Account {private String id = RandomStringUtils.randomAlphanumeric(6);private boolean status = true;private Zone zone = Zone.ZONE_1;private Money balance = Money.of(0.00, "USD");public Account() {}public Account(boolean status, Zone zone, double balance) {this.status = status;this.zone = zone;if (balance < 0)throw new IllegalArgumentException("The balance can not be negative");this.balance = Money.of(balance, "USD");}public enum Zone {ZONE_1, ZONE_2, ZONE_3}public String getId() {return id;}public boolean getStatus() {return status;}public Zone getZone() {return zone;}public Money getBalance() {return balance;}}

这是运行测试的屏幕截图:

测试结果

经过测试重构

可能在更复杂的示例中,测试变成绿色后,我将进行一些重构。 但是在这种简单情况下,我们不需要这个。 如果您对提高代码的可读性或样式有任何建议,请随时发表评论。

摘要

在本教程中,我们研究了如何使用Java使用TDD进行开发 ,从功能分析开始,以“绿色”单元测试和重构结束。 我试图在示例中解释TDD方法,该方法虽然不太琐碎,但也不太复杂。 无论如何,我希望它对您有所帮助并提供有益的信息。

翻译自: https://www.javacodegeeks.com/2015/11/introduction-java-tdd-part-2.html

tdd java

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/336700.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

计算机怎么没有桌面文件夹名称大全,你的电脑文件总是找不到?是时候学习文件夹分类整理了...

我们常常说做好办公整理&#xff0c;我们工作起来才更有效率&#xff1b;此处的办公整理不单单是对办公桌整理整齐&#xff0c;电脑里面的文件也需要定期整理&#xff0c;你有没有发现常常找一个文件的时候却总是找不到&#xff1f;那么此时就应该学习文件夹分类整理了&#xf…

selenide_使用Selenide进行有效的UI测试

selenide等待奇迹 圣诞节是奇迹的时刻。 在新的一年的前夕&#xff0c;我们都会制定下一个计划。 我们希望所有问题都将在最后一年消失&#xff0c;在来年出现奇迹。 每个Java开发人员都梦想着奇迹&#xff0c;使他成为世界上最有效的Java开发人员。 我想向你展示这样的奇迹…

win10无法更改计算机设置,Win10“无法保存ip设置,请检查一个或多个设置并重试”的解决方法...

近期有网友想要在Win10系统中手动设置本机IP地址&#xff0c;但是填写完毕之后却提示了“无法保存ip设置,请检查一个或多个设置并重试”&#xff0c;那么遇到这个问题&#xff0c;我们要如何解决呢&#xff1f;下面装机之家分享一下Win10“无法保存ip设置,请检查一个或多个设置…

24段魔尺拼图指南_拼图项目动手指南

24段魔尺拼图指南Jigsaw项目将把模块化引入Java平台&#xff0c;根据原始计划&#xff0c;它将在12月10日完成功能。 所以我们在这里&#xff0c;但拼图在哪里&#xff1f; 在过去的六个月中肯定发生了很多事情&#xff1a; 原型问世 &#xff0c;内部API的迫在眉睫的删除引起…

sql 解析 java_将Java 8流解析为SQL

sql 解析 java当Java 8发行并且人们开始流式处理各种东西时&#xff0c;不久之后他们就开始想象如果可以以相同的方式使用数据库将有多大的潜力。 本质上&#xff0c;关系数据库由以表状结构组织的巨大数据块组成。 这些结构非常适合进行过滤和映射操作&#xff0c;如SQL语言的…

杭州电子科技大学保研计算机,杭州电子科技大学计算机学院计算机科学与技术(一级学科)保研细则...

杭州电子科技大学计算机学院计算机科学与技术(一级学科)保研细则信息&#xff0c;是考研之前需要获取相应的考研信息&#xff0c;比如考试大纲、招考专业、招考目录等等基本信息&#xff0c;这些内容是进行考研前期工作的必要准备。考生可以从各院校的研招网进行查询&#xff0…

返回路径平面上的间隙_裁切机的上刀下刀如何调整?

每天都在使用裁切机时&#xff0c;由于各种因素往往会出现上刀、下刀现象(也称凸刀、凹刀现象)&#xff0c;给后面的套准带来困难。在此小编对上刀、下刀现象的产生原因做一分析与总结。01千斤压力不够(1)机械压力弹簧弹力不够。此时必须增大压力&#xff0c;如果增大到最大位置…

pcb板材的tg是什么_做到这6点,PCB过回焊炉不会出现板弯及板翘!

【维文信PCBworld】在PCB板子过回焊炉容易发生板弯及板翘&#xff0c;大家都知道&#xff0c;那么如何防止PCB板子过回焊炉发生板弯及板翘&#xff0c;下面就为大家阐述下&#xff1a;1.降低温度对PCB板子应力的影响既然「温度」是板子应力的主要来源&#xff0c;所以只要降低回…

java-ee-api_刷新器-Java EE 7概览

java-ee-api随着红帽JBoss企业应用平台7&#xff08;EAP 7&#xff09;的迫在眉睫&#xff0c;甚至WebLogic Server刚刚获得Java EE 7认证&#xff0c;我认为现在应该是时候对Java Enterprise Edition 7进行一些更新了。功能&#xff0c;并指向更多资源。 Java EE 7 –开发人员…

层 数据仓库_小尝试:基于指标体系的数据仓库搭建和数据可视化

关于作者&#xff1a;小姬&#xff0c;某知名互联网公司产品专家&#xff0c;对数据采集、生产、加工有所了解&#xff0c;期望多和大家交流数据知识&#xff0c;以数据作为提出好问题的基础&#xff0c;挖掘商业价值。0x00 前言我将整理文章分享数据工作中的经验&#xff0c;因…

计算机中级职称报考入口,2020年9月计算机职称考试报名流程(附入口)

2020年9月计算机等级报名公告正在陆续公布&#xff0c;计算机等级考试网上怎么报名&#xff1f;小编为大家整理计算机等级报名流程如下&#xff1a;2020年9月计算机等级报名流程一、注册通行证考生登入报名网页后&#xff0c;点击“用户注册”按钮&#xff0c;根据网页提示&…

简单工厂抽象工厂工厂方法_让工厂美丽

简单工厂抽象工厂工厂方法每个名副其实的Java程序员都知道Factory Pattern 。 这是一种便捷&#xff0c;标准化的方法&#xff0c;它通过教一个组件如何捕鱼而不是将它们交给它们来减少耦合。 但是&#xff0c;在使用大型系统时&#xff0c;该模式确实会向系统添加很多样板代码…

内蒙古大学计算机组成原理实验,内蒙古大学计算机组成原理期末练习0

内蒙古大学计算机组成原理期末练习0 (4页)本资源提供全文预览&#xff0c;点击全文预览即可全文预览,如果喜欢文档就下载吧&#xff0c;查找使用更方便哦&#xff01;9.9 积分第 1 页 共 4 页 《《计算机组成原理计算机组成原理》》期末练习期末练习 班级 专业 姓名 学号 编号 …

dev的编辑器不支持getchar吗_“两头婚兴起”:你支持不娶不嫁,孩子随父姓也随母姓吗?...

何为两头婚&#xff1f;简单来说就是男不娶&#xff0c;女不嫁&#xff0c;没有彩礼也没有嫁妆的说法。男女俩人结婚之后没有谁到谁家里之说&#xff0c;两夫妻过自己的小日子&#xff0c;与各自的原生家庭保持一定的联系。婚后生育两个孩子&#xff0c;一个随父姓&#xff0c;…

全国计算机证件照要露耳朵吗,结婚证照片要露耳朵么 结婚登记照露一只耳朵行吗...

结婚证件照&#xff0c;这是可以在在民政局里面照的&#xff0c;也是可以在外面的影楼照的&#xff0c;在外面影楼照的话&#xff0c;照出来会比较好看&#xff0c;就是价格有点贵。结婚证上面的照片是证件照&#xff0c;所以是有一定的要求的。露一只耳朵行不行呢&#xff1f;…

findfirst_当心findFirst()和findAny()

findfirst过滤Java 8 Stream &#xff0c;通常使用findFirst()或findAny()来获取在过滤器中幸存的元素。 但这可能并不能真正实现您的意思&#xff0c;并且可能会出现一些细微的错误。 那么 从我们的Javadoc&#xff08; 此处和此处 &#xff09;可以看出&#xff0c;这两种方…

java流式传输对象_使用Java 8在地图上流式传输

java流式传输对象在本文中&#xff0c;我将向您展示如何在标准Java映射上有效地实现Speedment Open Source流&#xff0c;并将Stream接口扩展为MapStream&#xff01; 即使在复杂的情况下&#xff0c;此添加将使保持流的具体性和可读性变得更加容易。 希望这将允许您继续流式传…

oracle11g支持xp吗_拔掉U盘前一定需要安全弹出吗?

相信每一个使用过U盘的人&#xff0c;都经历过不安全弹出USB设备就直接拔掉&#xff0c;然后被电脑无情提示没有正确弹出USB设备的状况。拔掉U盘前点击安全弹出&#xff0c;已经成了一种默认的操作。那么&#xff0c;问题来了&#xff0c;拔掉U盘前真的需要安全弹出吗&#xff…

java中使用kotlin_在Kotlin中使用libGDX

java中使用kotlin最近&#xff0c;我一直在阅读有关不同语言的信息&#xff0c;以及它们可以为已经拥挤的软件开发人员带来什么&#xff0c;并且一种语言对我来说很突出&#xff1a;Kotlin。 &#xff08; https://kotlinlang.org/ &#xff09; 这是一种相对较新的语言&#…

同时防服务器维修,加强服务器日常运维,避免宕机灾难发生

原标题&#xff1a;加强服务器日常运维&#xff0c;避免宕机灾难发生服务器作为我们日常网络的支撑&#xff0c;可以说是24小时的全天候运转。在这种无休止的“加班”的状态下&#xff0c;服务器必然容易出问题&#xff0c;一旦发生服务器宕机就会造成整个网络的瘫痪&#xff0…