前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >编写可靠的单元测试-断言AssertJ

编写可靠的单元测试-断言AssertJ

原创
作者头像
Alec
修改2020-06-04 10:33:15
9940
修改2020-06-04 10:33:15
举报
文章被收录于专栏:Java开发小站

单元测试在日常开发工作中是一个非常重要,但又经常被疏忽的地方。也是衡量代码健壮性的一个重要指标。如果在平时开发过程中注重单元测试的编写,那么在后期代码重构,扩展时会大大减小因为变动而造成的bug产生。因此建议大家养成编写单元测试的好习惯。尤其是一些持续迭代的项目。

AssertJ是一款为了提高测试代码的可读性,并简化测试的维护的Java类库。它可以让我们很方便,编写出简洁易懂的单元测试用例。为我们CICD提供帮助。

引用

  • maven形式引入类库:
代码语言:txt
复制
<dependency>
  <groupId>org.assertj</groupId>
  <artifactId>assertj-core</artifactId>
  <!-- use 2.9.1 for Java 7 projects -->
  <version>3.11.1</version>
  <scope>test</scope>
</dependency>
  • Gradle形式引入类库:
代码语言:txt
复制
testImplementation("org.assertj:assertj-core:3.16.1")
  • assertj-core 对jdk版本有要求限制,对应assertj-core.3.xxx 需要jdk8及以上版本支持,assertj-core.2.xxx 需要jdk7及以上版本支持。

断言使用

下面主要介绍常用的断言使用。需要特别说明本次说明所运用的版本是3.16.1 jdk版本1.8.

  • 1 基本类型判断
代码语言:txt
复制
  public class BasicTypeTest {
    /**
     * 判断等值匹配
     * */
    @Test
    public void shouldBeOne() {
        int targetValue = 1;
        //条件成立
        assertThat(targetValue).isEqualTo(1);
        //条件不成立
        assertThat(targetValue).isEqualTo(2);
    }

    /**
     * 范围匹配
     * */
    @Test
    public void shouldBeGreaterOrLess () {
        int targetValue = 5;
       // 大于3 条件成立
       assertThat(targetValue).isGreaterThan(3);
       //大于等于5 条件成立
       assertThat(targetValue).isGreaterThanOrEqualTo(5);
       //小于6 条件成立
       assertThat(targetValue).isLessThan(6);
       //小于等于5 条件成立
       assertThat(targetValue).isLessThanOrEqualTo(5);
       //区间范围 大于等于4 小于等于6
       assertThat(targetValue).isBetween(4, 6);
    }

    /**
     * 浮动匹配,接近于某一个区间
     * */
    @Test
    public void shouldBeClose() {
        double v = 10/3d;
        // v = 3.333333333.... 在 3.32 ~ 3.34 区间。条件成立
        assertThat(v).isCloseTo(3.33d, Offset.offset(0.01d));
    }

}
  • 2 字符串判断
代码语言:txt
复制
 

public class StringTypeTest {

    /**
     * 判断字符串长度
     * */
    @Test
    public void shouldHaveSize() {
        String targetValue = "Hello World";
        //字符串长度11 条件成立
        assertThat(targetValue).hasSize(11);
    }
    /**
     * 判断字符串Start or  null
     * */
    @Test
    public void shouldStartWith() {
        String targetValue = "Hello World";
        //以Hello 开头 条件成立
        assertThat(targetValue).startsWith("Hello");
        //不以World 开头 条件成立
        assertThat(targetValue).doesNotStartWith("World");
        //不为空 条件成立
        assertThat(targetValue).isNotEmpty();
        //为空 条件不成立
        assertThat(targetValue).isEmpty();
    }
    /**
     * 判断字符串包含
     * */
    @Test
    public void shouldContain() {
        String targetValue = "Hello World";
        //包含 Wor 字符 条件成立
        assertThat(targetValue).contains("Wor");
        //忽略大小写包含 l 条件成立
        assertThat(targetValue).containsIgnoringCase("L");
        //只包含一个 W 条件成立
        assertThat(targetValue).containsOnlyOnce("W");
        //不包含 R 条件成立
        assertThat(targetValue).doesNotContain("R");
    }
}
  • 集合匹配判断
代码语言:txt
复制
public class CollectionTest {

    @Test
    public void shouldHaveSize () {
        //list size is 7
        List<Integer> targetList = Arrays.asList(12, 33, 23,11,24,54,12);
        assertThat(targetList).hasSize(7);
    }

    @Test
    public void shouldContainSequence() {
        List<Integer> targetList = Arrays.asList(12, 33, 23,11,24,54,12);
        //按顺序依次包含元素
        assertThat(targetList).containsSequence(12,33,23,11);
        //不按顺序包含
        assertThat(targetList).contains(54, 23, 33,12);
        //指定位置包含指定元素 下标1 对应匹配33 ,下标5对应匹配54
        assertThat(targetList).contains(33, Index.atIndex(1)).contains(54,Index.atIndex(5));
        //不包含
        assertThat(targetList).doesNotContain(100);
        //只包含一次指定元素
        assertThat(targetList).containsOnlyOnce(33);
        //包含一个子序列
        assertThat(targetList).containsSubsequence(Arrays.asList(12,33));
        //包含全部元素并且顺序一致
        assertThat(targetList).containsExactlyElementsOf(Arrays.asList(12, 33, 23,11,24,54,12));

        //集合中是否有重复元素 条件不成立 当前list 中有 12 是重复的
        assertThat(targetList).doesNotHaveDuplicates();
    }
}

以上是我们常用到的一些断言表达式。还有很多,建议参考下面参考资料中的文档。

参考资料:

http://joel-costigliola.github.io/assertj/assertj-core.html

https://assertj.github.io/doc/

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 引用
  • 断言使用
  • 参考资料:
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档