单元测试断言利器 AssertJ

前言

由于JUnit的Assert是公认的烂API,所以不推荐使用,目前推荐使用的是AssertJ。

AssertJ网站: http://joel-costigliola.github.io/assertj/

github上examples 地址 https://github.com/joel-costigliola/assertj-examples

附件中assertj-examples-octo-assertj-core-1.5.0是官方examples

整理一些常用的例子如下

对字符串断言

Java代码

  1. @Test
  2. public void testString() {
  3. String str = null;
  4. // 断言null或为空字符串
  5. assertThat(str).isNullOrEmpty();
  6. // 断言空字符串
  7. assertThat("").isEmpty();
  8. // 断言字符串相等 断言忽略大小写判断字符串相等
  9. assertThat("Frodo").isEqualTo("Frodo").isEqualToIgnoringCase("frodo");
  10. // 断言开始字符串 结束字符穿 字符串长度
  11. assertThat("Frodo").startsWith("Fro").endsWith("do").hasSize(5);
  12. // 断言包含字符串 不包含字符串
  13. assertThat("Frodo").contains("rod").doesNotContain("fro");
  14. // 断言字符串只出现过一次
  15. assertThat("Frodo").containsOnlyOnce("do");
  16. // 判断正则匹配
  17. assertThat("Frodo").matches("..o.o").doesNotMatch(".*d");
  18. }

对数字断言

Java代码

  1. @Test
  2. public void testNumber() {
  3. Integer num = null;
  4. // 断言空
  5. assertThat(num).isNull();
  6. // 断言相等
  7. assertThat(42).isEqualTo(42);
  8. // 断言大于 大于等于
  9. assertThat(42).isGreaterThan(38).isGreaterThanOrEqualTo(38);
  10. // 断言小于 小于等于
  11. assertThat(42).isLessThan(58).isLessThanOrEqualTo(58);
  12. // 断言0
  13. assertThat(0).isZero();
  14. // 断言正数 非负数
  15. assertThat(1).isPositive().isNotNegative();
  16. // 断言负数 非正数
  17. assertThat(-1).isNegative().isNotPositive();
  18. }

对日期断言

Java代码

  1. @Test
  2. public void testDate() {
  3. // 断言与指定日期相同 不相同 在指定日期之后 在指定日期之钱
  4. assertThat(Dates.parse("2014-02-01")).isEqualTo("2014-02-01").isNotEqualTo("2014-01-01")
  5. .isAfter("2014-01-01").isBefore(parse("2014-03-01"));
  6. // 断言 2014 在指定年份之前 在指定年份之后
  7. assertThat(DateTime.now().toDate()).isBeforeYear(2020).isAfterYear(2013);
  8. // 断言时间再指定范围内 不在指定范围内
  9. assertThat(parse("2014-02-01")).isBetween("2014-01-01", "2014-03-01").isNotBetween(
  10. parse("2014-02-02"), parse("2014-02-28"));
  11. // 断言两时间相差100毫秒
  12. Date d1 = new Date();
  13. Date d2 = new Date(d1.getTime() + 100);
  14. assertThat(d1).isCloseTo(d2, 100);
  15. // sets dates differing more and more from date1
  16. Date date1 = Dates.parseDatetimeWithMs("2003-01-01T01:00:00.000");
  17. Date date2 = parseDatetimeWithMs("2003-01-01T01:00:00.555");
  18. Date date3 = parseDatetimeWithMs("2003-01-01T01:00:55.555");
  19. Date date4 = parseDatetimeWithMs("2003-01-01T01:55:55.555");
  20. Date date5 = parseDatetimeWithMs("2003-01-01T05:55:55.555");
  21. // 断言 日期忽略毫秒,与给定的日期相等
  22. assertThat(date1).isEqualToIgnoringMillis(date2);
  23. // 断言 日期与给定的日期具有相同的年月日时分秒
  24. assertThat(date1).isInSameSecondAs(date2);
  25. // 断言 日期忽略秒,与给定的日期时间相等
  26. assertThat(date1).isEqualToIgnoringSeconds(date3);
  27. // 断言 日期与给定的日期具有相同的年月日时分
  28. assertThat(date1).isInSameMinuteAs(date3);
  29. // 断言 日期忽略分,与给定的日期时间相等
  30. assertThat(date1).isEqualToIgnoringMinutes(date4);
  31. // 断言 日期与给定的日期具有相同的年月日时
  32. assertThat(date1).isInSameHourAs(date4);
  33. // 断言 日期忽略小时,与给定的日期时间相等
  34. assertThat(date1).isEqualToIgnoringHours(date5);
  35. // 断言 日期与给定的日期具有相同的年月日
  36. assertThat(date1).isInSameDayAs(date5);
  37. }

对List断言

Java代码

  1. @Test
  2. public void testList() {
  3. // 断言 列表是空的
  4. assertThat(newArrayList()).isEmpty();
  5. // 断言 列表的开始 结束元素
  6. assertThat(newArrayList(1, 2, 3)).startsWith(1).endsWith(3);
  7. // 断言 列表包含元素 并且是排序的
  8. assertThat(newArrayList(1, 2, 3)).contains(1, atIndex(0)).contains(2, atIndex(1)).contains(3)
  9. .isSorted();
  10. // 断言 被包含与给定列表
  11. assertThat(newArrayList(3, 1, 2)).isSubsetOf(newArrayList(1, 2, 3, 4));
  12. // 断言 存在唯一元素
  13. assertThat(Lists.newArrayList("a", "b", "c")).containsOnlyOnce("a");
  14. }

对Map断言

Java代码

  1. @Test
  2. public void testMap() {
  3. Map<String, Object> foo = Maps.newHashMap();
  4. foo.put("A", 1);
  5. foo.put("B", 2);
  6. foo.put("C", 3);
  7. // 断言 map 不为空 size
  8. assertThat(foo).isNotEmpty().hasSize(3);
  9. // 断言 map 包含元素
  10. assertThat(foo).contains(entry("A", 1), entry("B", 2));
  11. // 断言 map 包含key
  12. assertThat(foo).containsKeys("A", "B", "C");
  13. // 断言 map 包含value
  14. assertThat(foo).containsValue(3);
  15. }

对Class断言

Java代码

  1. @Test
  2. public void testClass() {
  3. // 断言 是注解
  4. assertThat(Magical.class).isAnnotation();
  5. // 断言 不是注解
  6. assertThat(Ring.class).isNotAnnotation();
  7. // 断言 存在注解
  8. assertThat(Ring.class).hasAnnotation(Magical.class);
  9. // 断言 不是借口
  10. assertThat(Ring.class).isNotInterface();
  11. // 断言 是否为指定Class实例
  12. assertThat("string").isInstanceOf(String.class);
  13. // 断言 类是给定类的父类
  14. assertThat(Person.class).isAssignableFrom(Employee.class);
  15. }
  16. @Magical
  17. public enum Ring {
  18. oneRing, vilya, nenya, narya, dwarfRing, manRing;
  19. }
  20. @Target(ElementType.TYPE)
  21. @Retention(RetentionPolicy.RUNTIME)
  22. public @interface Magical {}
  23. public class Person {}
  24. public class Employee extends Person {}

使用fail方法

Java代码

  1. @Test
  2. public void testFail() {
  3. try {
  4. fail("在不检查任何条件的情况下使断言失败。显示一则消息");
  5. } catch (AssertionError ae) {
  6. logger.info("可以通过catch捕获该Error");
  7. }
  8. try {
  9. failBecauseExceptionWasNotThrown(ServiceException.class);
  10. } catch (AssertionError ae) {
  11. logger.info("可以通过catch捕获该Error");
  12. }
  13. }

除此之外,还提供包括Exception、Iterable、JodaTime、Guava等等很多的断言支持。

原文地址:https://www.cnblogs.com/d-d-w/p/9687184.html

时间: 2024-08-29 22:20:49

单元测试断言利器 AssertJ的相关文章

流式断言器AssertJ介绍

本文来自网易云社区 作者:范旭斐 大家在使用testng.junit做自动化测试的过程中,经常会用到testng.junit自带的断言器,有时候对一个字符串.日期.列表进行断言很麻烦,需要借助到jdk或者第三方包的方法进行处理后断言,无形之中增加了代码量,测试用例方法的代码看起来也不够友好,很臃肿.总体来说,junit&testng的断言API还可以,功能不算强大,只能说是满足我们日常测试的需求.这里向大家推荐一款功能强大的流式断言器--AssertJ,所谓的流式断言就是相较于Assert的单个

cakephp 单元测试断言方法总结

前言 cakephp 的单元测试 参考http://book.cakephp.org/2.0/en/development/testing.html 以下是CakeTestCase类的断言,也就是cakephp 定义的断言,实际使用中还可以使用CakeTestCase的父类 PHPUnit_Framework_TestCase里面的断言 1.assertEqual 是否相等,测试期望的数据和结果是否相等 2.assertNotEqual 是否不相等 3.assertPattern 是否符合正则匹

[译]重新思考单元测试断言

原文地址:https://medium.com/javascript-scene/rethinking-unit-test-assertions-55f59358253f 作者:Eric Elliott 「断言」是编程术语,表示为一些布尔表达式,程序员相信在程序中的某个特定点该表达式值为真,可以在任何时候启用和禁用断言验证,因此可以在测试时启用断言而在部署时禁用断言.同样,程序投入运行后,最终用户在遇到问题时可以重新启用断言. 每当测试失败的时候,靠谱的自动化测试总能生成一份优秀的错误报告(bu

单元测试断言汇总

XCTFail(...) 任何尝试都会测试失败,...是输出的提示文字.(后面都是这样) XCTAssertNil(expression, ...) expression为空时通过,否则测试失败. expression接受id类型的参数. XCTAssertNotNil(expression, ...) expression不为空时通过,否则测试失败. expression接受id类型的参数. XCTAssert(expression, ...) expression为true时通过,否则测试失

使用 Spring 进行单元测试

单元测试和集成测试在我们的软件开发整个流程中占有举足轻重的地位,一方面,程序员通过编写单元测试来验证自己程序的有效性,另外一方面,管理者通过持续自动的执行单元测试和分析单元测试的覆盖率等来确保软件本身的质量.这里,我们先不谈单元测试本身的重要性,对于目前大多数的基于 Java 的企业应用软件来说,Spring 已经成为了标准配置,一方面它实现了程序之间的低耦合度,另外也通过一些配置减少了企业软件集成的工作量,例如和 Hibernate.Struts 等的集成.那么,有个问题,在普遍使用 Spri

在Visual Studio2015中使用单元测试

所谓的单元测试(Unit Test),就是对软件的一些模块进行测试以检查其正确性和可靠性,这些模块可以是一个类或者是一个方法等.在Visual studio中,这十分容易实现. 打开Visual studio,文件->新建->项目,在此演示的是为通用Windows平台创建单元测试,因此展开Visual C#->Windows->通用->单元测试应用(通用Windows).如图, 这里单元测试的项目名为UnitTest4Demo 创建完成后,为了使条理清晰,我们在解决方案中新建

MapReduce的C#实现及单元测试(试验)

MapReduce.cs类文件代码  MapReduce的执行方法 using System; using System.Collections.Generic; //using System.Linq; //using System.Threading.Tasks; namespace MapReduce { /// <summary> /// Very Simple MapReduce implementation in C# /// </summary> /// <re

iOS中的单元测试(一)

转载自http://www.infoq.com/cn/articles/ios-unit-test-1 导读:本文不讨论单元测试是什么,或者它之于一个工程的利弊,我认为单元测试是一个开发者保证产出代码质量的有效工具.本文从使用者的角度对比当下比较流行的两款单元测试框架,给大家提供一些选用建议.如果你还不甚了解单元测试在工程中所起到的作用,或者还不知道TDD的开发模式,可参考:Test-Driven Development和Unit Testing. 本文对比两个iOS开发中常见的单元测试框架:O

Spring 单元测试的学习

单元测试和集成测试在我们的软件开发整个流程中占有举足轻重的地位,一方面,程序员通过编写单元测试来验证自己程序的有效性,另外一方面,管理者通过持续自动的执行单元测试和分析单元测试的覆盖率等来确保软件本身的质量.这里,我们先不谈单元测试本身的重要性,对于目前大多数的基于 Java 的企业应用软件来说,Spring 已经成为了标准配置,一方面它实现了程序之间的低耦合度,另外也通过一些配置减少了企业软件集成的工作量,例如和 Hibernate.Struts 等的集成.那么,有个问题,在普遍使用 Spri