这些信息太不清晰,理应得到改善。

私有方法

那么,我们究竟能做些什么呢?好吧,最显而易见的办法是将断言抽成一个私有方法:

private void assertThatRangeExists(List ranges, int rangeNb,

String start, String stop) throws ParseException {

assertEquals(ranges.get(rangeNb).getStart(), SDF.parse(start).getTime());

assertEquals(ranges.get(rangeNb).getEnd(), SDF.parse(stop).getTime());

}

@Test

public void shouldReturnHourlyRanges() throws ParseException {

// given

Date dateFrom = SDF.parse("2012-07-23 12:00");

Date dateTo = SDF.parse("2012-07-23 15:00");

// when

final List ranges = HourlyRange.getRanges(dateFrom, dateTo);

// then

assertEquals(ranges.size(), 3);

assertThatRangeExists(ranges, 0, "2012-07-23 12:00", "2012-07-23 13:00");

assertThatRangeExists(ranges, 1, "2012-07-23 13:00", "2012-07-23 14:00");

assertThatRangeExists(ranges, 2, "2012-07-23 14:00", "2012-07-23 15:00");

}

这样是不是好些?我会说是的。减少了重复代码的数量,提高了可读性,这当然是件好事。

这种方法的另一个优势是,我们现在可以更容易地改善验证失败时的错误信息。因为断言代码被抽到了一个方法中,所以我们可以改善断言,很容易地提供更可读的错误信息。

为了更好地复用这些断言方法,可以将它们放到测试类的基类中。

不过,我觉得我们也许能做得更好:使用私有方法也有缺点,随着测试代码的增长,很多测试方法都将使用这些私有方法,其缺点将更加明显:

断言方法的命名很难清晰反映其校验的内容。

随着需求的增长,这些方法将会趋向于接收更多的参数,以满足更复杂检查的要求。(assertThatRangeExists()现在有4个参数,已经太多了!)

有时候,为了在多个测试中复用这些代码,会在这些方法中引入一些复杂逻辑(通常以布尔标志的形式校验它们,或在某些特殊的情况下,忽略它们)。

从长远来看,所有使用私有断言方法编写的测试,意味着在可读性和可维护性方面将会遇到一些问题。我们来看一下另外一种没有这些缺点的解决方案。

匹配器类库

在我们继续之前,我们先来了解一些新工具。正如之前提到的,JUnit或者TestNG提供的断言缺少足够的灵活性。在Java世界,至少有两个开源类库能够满足我们的需求:AssertJ(FEST Fluent Assertions项目的一个分支)和 Hamcrest。我倾向于第一个,但这只是个人喜好。这两个看起来都非常强大,都能让你取得相似的效果。我更倾向于AssertJ的主要原因是它基于Fluent接口,而IDE能够完美支持该接口。

集成AssertJ和JUnit或者TestNG非常简单。你只要增加所需的import,停止使用测试框架提供的默认断言方法,改用AssertJ提供的方法就可以了。

AssertJ提供了一些现成的非常有用的断言。它们都使用相同的“模式”:先调用assertThat()方法,这是Assertions类的一个静态方法。该方法接收被测试对象作为参数,为更多的验证做好准备。之后是真正的断言方法,每一个都用于校验被测对象的各种属性。我们来看一些例子:

assertThat(myDouble).isLessThanOrEqualTo(2.0d);

assertThat(myListOfStrings).contains("a");

assertThat("some text")

.isNotEmpty()

.startsWith("some")

.hasLength(9);

从这能看出,AssertJ提供了比JUnit和TestNG丰富得多的断言集合。就像最后一个assertThat("some text")例子显示的,你甚至可以将它们串在一起。还有一个非常方便的事情是,你的IDE能够根据被测对象的类型,自动为你提示可用的方法。举例来说,对于一个double值,当你输入“assertThat(myDouble).”,然后按下CTRL + SPACE(或者其它IDE提供的快捷键),IDE将为你显示可用的方法列表,例如isEqualTo(expectedDouble)、isNegative()或isGreaterThan(otherDouble),所有这些都可用于double值的校验。这的确是一个很酷的功能。

java断言assertequals_如何实现Java测试的自定义断言相关推荐

  1. 利用Diferencia和Java微服务进行分接比较测试

    本文要点 在微服务体系结构中,许多服务可能同时在(相对)独立地演化,而且通常非常迅速.要获得这种架构风格的全部价值,服务必须能够独立发布. 通常很难验证新服务(或服务的新版本)没有对当前的应用程序造成 ...

  2. java assert false_深入剖析Java中的断言assert

    Java陷阱之assert关键字 一.概述 在C和C++语言中都有assert关键,表示断言. 在Java中,同样也有assert关键字,表示断言,用法和含义都差不多. 二.语法 在Java中,ass ...

  3. parallel循环java_Java 8 lambda stream forEach parallel 等循环与Java 7 for each 循环耗时测试...

    Java 8 里面的stream 有串行流和并行流之分. 说高级的stream就是那个并行流.下面是那个并行流的简单实现.只要是继承Collection类的都可以这么用. list.stream(). ...

  4. java swing实现简单图片显示(测试生成图片快捷方式)

    原链接:https://yq.aliyun.com/articles/58303 package com.ts.x;import java.awt.Image; import java.awt.ima ...

  5. Java 控制台程序的基本结构测试分析草稿

    Java 控制台程序的基本结构测试分析 19 xon 继续

  6. JNI开发笔记(八)--Java读取txt文件进行JNI测试

    Java读取txt文件进行JNI测试 引 前言 1. 新建assets文件夹 2. 载入测试文件 3. 建立文件读取方法 4. 在MainActivity中读取文件数据 引 JNI开发笔记(一)–An ...

  7. java设计一个程序后怎么测试_Java语言程序设计(第1阶段学习测试)(都平)

    第 1 页 共 5 页 山东省过程性考试课程 Java 语言程序设计(第2阶段)测试 一. 简答题 (本大题共15个小题,每小题4分,共60分) 1. 什么是类?任何定义一个类?类中包含哪几部分,分别 ...

  8. Java微信支付API文档测试

    Java微信支付API文档测试(注意用的微信开发文档是什么支付) 本人用的刷卡支付( 之前看错了,一直在看扫码支付,心塞 ),如图 首先,做一系列准备,获取appid等等,可以写在一个配置文件里面,如 ...

  9. Java设计一个测桃花模块_20145209刘一阳《JAVA程序设计》第一周课堂测试

    第一周课堂测试 1.下列不属于Java后继技术的是(D) A .Android B .JSP C .XML D .Python 2.下列关于Java语言特点的描述,正确的一组是(C) A .面向过程: ...

最新文章

  1. python wand安装_Python Wand posterize()用法及代码示例
  2. Scala自动隐式转换
  3. TensorFlow 教程——手写数字识别
  4. linux 文件夹 含义 表示(转)
  5. 从壹开始【学代码】|| 我开发中的用到的几个框架
  6. configure 查找依赖库_由浅入深:Python 中如何实现自动导入缺失的库?
  7. 拉格朗日中值定理ξ怎么求_高等数学3.1中值定理
  8. es6中一些基本的使用方法
  9. linux调时区北京,Linux修改系统时间和中国时区
  10. short s1 = 1; s1 = s1 + 1;有错吗?short s1 = 1; s1 += 1;有错吗?
  11. OneNote同步问题,提示没有权限
  12. .NET中XML 注释 SandCastle 帮助文件.hhp 使用HTML Help Workshop生成CHM文件
  13. Java SE 第三讲(原生数据类型使用陷阱 Pitfall of Primitive Data Type)
  14. 区块链≠分布式账本,别再傻傻分不清
  15. 【mediacodec】MediaRecorder--MediaCodec
  16. 法院判错案如何追责?
  17. C# 阿里云短信接口调用(不使用SDK,单文件完成)
  18. 优麒麟20.10 wifi 开关打不开解决方案
  19. Matlab拟合幂律分布
  20. 光猫修改配置同步到服务器,光猫—防火墙—3台服务器防火墙需要怎么配置,防火墙做二层?...

热门文章

  1. Loader 知识梳理(2) initLoader和restartLoader的区别
  2. pyCharm最新2017激活
  3. 生产环境运行Docker的9个关键决策
  4. Windows批处理符号简介、常用Dos命令
  5. HTML5 中的新特性:
  6. golang - strings
  7. Oracle建立表空间,用户等环节
  8. 什么是计算机考试题,计算机考试word什么版本 计算机word考试试题
  9. SpringBoot版本:1.5.12.RELEASE 文件大小限制异常拦截网关zuul报错
  10. 利用接口做参数,写个计算器,能完成加减乘除运算。 (1)定义一个接口Compute含有一个方法int computer(int n, int m)。 (2)设计四个类分