流式断言器AssertJ入门介绍

    xiaoxiao2025-04-14  13

    之前一直使用Junit自带的Assert类进行断言,尽管这能满足一些我们最基础的需要,但从功能上来讲还是不够强大的。

    今天介绍一款功能强大的流式断言器AssertJ,所谓的流式断言就是相较于Assert的单个校验点断言,支持一条断言语句对实际值同时断言多个校验点。

    官方地址:http://joel-costigliola.github.io/assertj/ 开源地址:https://github.com/joel-costigliola/assertj-core

    从官网上我们可以看到AssertJ支持的库有这些,具体用法上官方查询:

    Core:AssertJ core is a Java library that provides a fluent interface for writing assertions.

    Assertions generator:Use the Assertion Generator to create assertions specific to your own classes.

    Guava:AssertJ assertions for Guava provides assertions for Guava types like Multimap, Table, Optional, Range or ByteSource.

    Joda-Time:AssertJ assertions for Joda-Time provides assertions for Joda-Time types like DateTime and LocalDateTime.

    DB:AssertJ-DB provides assertions to test data in a database.

    Neo4j:Provides assertions for Neo4j 2 or higher.

    Swing:AssertJ Swing is a Java library that provides a fluent interface for functional Swing UI testing.

    maven引入依赖如下:

    <dependency> <groupId>org.assertj</groupId> <artifactId>assertj-core</artifactId> <!-- use 3.0.0 for Java 8 projects --> <!-- 2.0.0 required Java 7 --> <!-- 1.7.1 for Java 6 --> <version>1.7.1</version> <scope>test</scope> </dependency>

    此外对应的开发库引入如下:

    <dependency> <groupId>org.assertj</groupId> <artifactId>assertj-joda-time</artifactId> <version>1.1.0</version> <scope>test</scope> </dependency> <dependency> <groupId>org.assertj</groupId> <artifactId>assertj-guava</artifactId> <version>2.0.0</version> <scope>test</scope> <exclusions> <exclusion> <groupId>org.assertj</groupId> <artifactId>assertj-core</artifactId> </exclusion> </exclusions> </dependency> <dependency> <groupId>org.assertj</groupId> <artifactId>assertj-neo4j</artifactId> <version>1.0.0</version> <scope>test</scope> </dependency> <dependency> <groupId>org.assertj</groupId> <artifactId>assertj-db</artifactId> <version>1.0.1</version> <scope>test</scope> </dependency>

    官方上的用法介绍:

    // 为所有assertThat和工具方法提供唯一访问入口(例如entry) import static org.assertj.core.api.Assertions.*; // 下面的示例中,fellowshipOfTheRing是一个TolkienCharacter列表 // 简单断言 assertThat(frodo.getName()).isEqualTo("Frodo"); assertThat(frodo).isNotEqualTo(sauron) .isIn(fellowshipOfTheRing); // String断言 assertThat(frodo.getName()).startsWith("Fro") .endsWith("do") .isEqualToIgnoringCase("frodo"); // 集合断言 assertThat(fellowshipOfTheRing).hasSize(9) .contains(frodo, sam) .doesNotContain(sauron); // 使用extracting特性检查fellowshipOfTheRing中的名字:) assertThat(fellowshipOfTheRing).extracting("name").contains("Boromir", "Gandalf", "Frodo", "Legolas") .doesNotContain("Sauron", "Elrond"); // Java 8方式的extracting assertThat(fellowshipOfTheRing).extracting(character -> character.getRace().getName()) .contains("Hobbit", "Elf") .doesNotContain("Orc"); // 断言之前过滤集合 assertThat(fellowshipOfTheRing).filteredOn("race", HOBBIT) .containsOnly(sam, frodo, pippin, merry); // 使用Java 8 lambda predicate过滤集合 assertThat(fellowshipOfTheRing).filteredOn(character -> character.getName().contains("o")) .containsOnly(aragorn, frodo, legolas, boromir); // 将extraction和过滤结合(是的,我们可以做到) assertThat(fellowshipOfTheRing).filteredOn(character -> character.getName().contains("o")) .containsOnly(aragorn, frodo, legolas, boromir) .extracting(character -> character.getRace().getName()) .contains("Hobbit", "Elf", "Man");

    个人常用到的一些方法: String 校验

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

    数字校验

    @Test public void testNumber() { Integer num = null; // 断言空 assertThat(num).isNull(); // 断言相等 assertThat(42).isEqualTo(42); // 断言大于 大于等于 assertThat(42).isGreaterThan(38).isGreaterThanOrEqualTo(38); // 断言小于 小于等于 assertThat(42).isLessThan(58).isLessThanOrEqualTo(58); // 断言0 assertThat(0).isZero(); // 断言正数 非负数 assertThat(1).isPositive().isNotNegative(); // 断言负数 非正数 assertThat(-1).isNegative().isNotPositive(); }

    时间断言

    @Test public void testDate() { // 断言与指定日期相同 不相同 在指定日期之后 在指定日期之钱 assertThat(Dates.parse("2014-02-01")).isEqualTo("2014-02-01").isNotEqualTo("2014-01-01") .isAfter("2014-01-01").isBefore(parse("2014-03-01")); // 断言 2014 在指定年份之前 在指定年份之后 assertThat(DateTime.now().toDate()).isBeforeYear(2020).isAfterYear(2013); // 断言时间再指定范围内 不在指定范围内 assertThat(parse("2014-02-01")).isBetween("2014-01-01", "2014-03-01").isNotBetween( parse("2014-02-02"), parse("2014-02-28"));

    List断言

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

    Map断言

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

    添加错误提示信息: as

    assertThat("abc").as("校验abc").isEqualTo("abcd"); 错误提示: org.junit.ComparisonFailure: [校验abc] expected:<"abc[d]"> but was:<"abc[]">

    链式校验

    // isEqualTo 相等, contains包含 assertThat("abc").as("校验abc").isEqualTo("abc").contains("d"); 错误提示: FAILED: testAssertJ java.lang.AssertionError: [校验abc] Expecting: <"abc"> to contain: <"d">

    大小校验

    List list = new ArrayList(); assertThat(list).hasSize(1); FAILED: testAssertJ java.lang.AssertionError: Expected size:<1> but was:<0> in: <[]>

    null判断

    Object object = null; assertThat(object).isNotNull(); assertThat(object).isNull();

    同时,AssertJ还支持自定义断言,就是根据自己的需求,自定义断言类型。

    转载请注明原文地址: https://ju.6miu.com/read-1298053.html
    最新回复(0)