tl; dr,您可以使用标签来阐明给定的测试时间样式。

什么时候给出?

给定的时间,然后是一种指定系统行为的常用样式,其中您的测试分为三个部分。

  • 给定的部分列出了测试的前提条件,即在开始之前假设世界所处的任何状态。
  • When子句执行要测试的动作。
  • 然后,Then语句检查后置条件是否成立。 通常以声明值或检查与模拟的交互的形式。

并非总是这种情况,您需要在每个测试的代码中包含三个部分。 例如,您的给定部分可能被通用的setUp方法覆盖。 我认为遵循模式并拆分不同的部分是一个好主意,因为它使您可以从树木中清晰地看到木材。

在Junit中使用标签

在某些项目中,我一直在尝试进一步扩展工作,而不仅仅是将给定/何时/然后拆分并使用Java标签,以便对测试的不同部分进行布局以使事情变得更加清晰* 。 以下代码段显示了如何使用Junit来实现。

Cafe cafe = new Cafe();@Testpublic void cafeShouldNeverServeCoffeeItDoesntHave() {Given:cafe.setCoffeesRemaining(1);When:cafe.serveCoffee();Then:assertFalse(cafe.canServeCoffee());}

这是一个非常简单的示例,仅用于演示布局。 我们的测试检查了Cafe提供了从未提供过的咖啡。 标签清楚地划分了代码的三个部分。 看到这样使用标签是有点不寻常的-它们在Java中最常用,是一种一次性突破嵌套循环的方法。 当然,没有真正的理由不这样使用它们,这只是一个样式问题,带有标签和不带有标签的代码之间没有语义差异。

将标签与Lambda行为配合使用

我确定大多数Java开发人员都在使用Junit,但我最近发布了一个名为Lambda Behave的新库。 它被设计为Java 8的现代测试和行为规范框架,使编写流畅和易读的测试变得更加容易。 在lambda-behave中,您通过列出描述性字符串而不是限制性方法名来编写测试,并在lambda表达式中描述测试的主体。 我发现以这种风格编写的测试更容易阅读。

您可以在lambda-behave规范中使用相同的给定/何时/然后标签样式,如以下代码示例所示:

describe("a cafe", it -> {Cafe cafe = new Cafe();it.should("never serve coffee it doesn't have", expect -> {Given:cafe.setCoffeesRemaining(1);When:cafe.serveCoffee();Then:expect.that(cafe.canServeCoffee()).is(false);});});

局限性与替代方案

以这种方式使用标签的最大麻烦在于,由于我不知道的原因,您不能在Java中的变量声明语句之前编写标签。 这意味着,如果要使用新变量启动Given:子句,则需要将变量声明提升到块顶部或a字段中。 我还没有发现这是个大问题,实际上吊装机可以进一步清理东西。

另一种可能也是更常见的方法是使用注释来表示给定/何时/然后子句。 我认为两者之间的选择主要是文体而非实质。 在这两种情况下,您都只是编写一些说明性文字,而不是像Cucumber和JBehave这样将功能烘焙到测试框架中。 我认为,如果您已在团队中达成约定,并且希望使这些标签比常规注释更突出,则将标签用作单个注释的想法比较合适。

有些人在给定/何时/然后使用相似的替代模式,但是具有更多阶段,例如四阶段测试方法,甚至使用不同的名称,例如Arrange,Act,Assert 。 这些样式也可以使用基于标签或基于注释的约定。

结论

如果有人想在其IDE中进行外观或玩耍,我会将示例代码放在github上 。 没有太多的代码,因为它们只是非常简单的示例,但是显示没有魔术可能会有所帮助!

在本博客文章中,我已经展示了如何使用标签来阐明代码块的意图,希望这是人们发现有用和有用的一种技术。 无论您是否使用标签来实现给定时间,我都希望人们遵循某种约定编写测试。 这确实使事情变得更加清晰。 我确定有人对此事有意见,所以让我知道您认为这是个好主意吗?

*我/认为/我在一次LJC活动上与他交谈后从Jose Llarena那里得到了这个主意,所以谢谢Jose!

翻译自: https://www.javacodegeeks.com/2015/01/given-when-then-in-java.html

在Java中给出的时间相关推荐

  1. java 线程什么时候出栈_在Java中给出的时间

    java 线程什么时候出栈 tl; dr,您可以使用标签来阐明给定的测试时间样式. 什么时候给出? 给定的时间,然后是指定系统行为的一种常用样式,其中您的测试分为三个部分. 给定的部分列出了测试的先决 ...

  2. java 正则表达式 判断 日期_怎么在java中利用正则表达式对时间日期进行判断

    怎么在java中利用正则表达式对时间日期进行判断 发布时间:2020-12-08 16:18:34 来源:亿速云 阅读:105 作者:Leah 这篇文章给大家介绍怎么在java中利用正则表达式对时间日 ...

  3. JAVA中获取当前系统时间

    JAVA中获取当前系统时间 转自:http://www.cnblogs.com/Matrix54/archive/2012/05/01/2478158.html 一. 获取当前系统时间和日期并格式化输 ...

  4. 为什么我可以在Java中抛出null? [重复]

    本文翻译自:Why can I throw null in Java? [duplicate] This question already has an answer here: 这个问题已经在这里有 ...

  5. JAVA中获得前一天的时间

    JAVA中获得前一天的时间 public static void main(String[] args) {SimpleDateFormat sdf=new SimpleDateFormat(&quo ...

  6. Java中获取日期和时间

    Java中获取日期和时间 1.创建 java.util.Calendar 实例,调用其 get()方法传入不同的参数即可获 得参数所对应的值 import java.util.Calender; // ...

  7. Java 中的日期与时间

    Java 日期时间 标签 : Java基础 Date java.util.Date对象表示一个精确到毫秒的瞬间; 但由于Date从JDK1.0起就开始存在了,历史悠久,而且功能强大(既包含日期,也包含 ...

  8. 关于Java中的日期与时间的相关类说明详解

    文章目录 1.关于Java元年与时间戳 2.关于Date类 2.1常用API代码展示 3.关于Calendar类 3.1获取Calendar对象 3.2创建自定义的Calendar对象 3.2Cale ...

  9. 详解java中的日期与时间;新旧API对比;各种日期格式转换

    一.基本概念 1.本地时间 不同的时区,在同一时刻,本地时间是不同的. 全球一共分为24个时区,伦敦所在的时区称为标准时区,其他时区按东/西偏移的小时区分,北京所在的时区是东八区. 2.时区 GMT ...

最新文章

  1. ThreadLocalRandom 安全吗
  2. 系统架构师学习笔记_第二章_连载
  3. 如何解决“HttpException (0x80004005): 超过了最大请求长度”问题
  4. ORACLE如何删除归档日志文件
  5. 等了这么久,就给我看这个?
  6. 高光谱数据集_基于飞桨实现高光谱反演:通过遥感数据获取土壤某物质含量
  7. python基础元组(五)
  8. [转载] numpy用法(logical_and, nonzero,arange, reshape)
  9. 素数在c语言中怎么表示,请问素数怎么样表示
  10. python各个版本区别_Python 的各个版本
  11. 锐起BSD5.0企业无盘下载免费试用
  12. Windows系统与虚拟机共享文件夹,映射的磁盘显示“信号灯超时”
  13. C#——NotifyICON的使用
  14. python怎么把数据导入excel_如何把python中的数据导入excel
  15. Java UI设计 计算三角形周长
  16. Android requires compiler compliance level 5.0 or 6.0. Found '1.7' instead.
  17. BS1022-基于React native+springboot开发服务端后台实现体育资讯类APP
  18. 中国谋略第一书:《素书》全文解析
  19. Vue3-watch
  20. 小程聊微服务--微服务思想

热门文章

  1. AVL树双旋转+图解
  2. linux 查看本机网关地址,linux查看服务器网关地址
  3. java代码识别_识别Java中的代码气味
  4. java流式传输对象_使用Java 8在地图上流式传输
  5. 众神进入瓦尔哈拉_一时冲动:“通往瓦尔哈拉之路的冒险”
  6. spring aop示例_Spring查找方法示例
  7. java与java ee_RxJava + Java8 + Java EE 7 + Arquillian =幸福
  8. ClassNotFoundException:是否会减慢您的JVM?
  9. 实现函数克隆_哪个更好的选择:克隆或复制构造函数?
  10. JavaFX技巧29:使布局忽略不可见的节点