首页 > 编程语言 >[Java SE] Assert断言 [转]

[Java SE] Assert断言 [转]

时间:2024-07-01 10:42:57浏览次数:1  
标签:lang code Java compiled void Assert java public SE

什么是Assert?

  • Assert,也叫断言,写代码时,我们可以预先进行假设一些正常时不应该发生的情况,断言就是用于在代码中捕捉这些假设,在发生这些假设的情况时,给出警告并退出,可以将断言看作是异常处理的一种高级形式。

  • Assert其实就是对一个boolean表达式进行判断:

  • true 时,则:程序继续运行
  • false时,则:表示程序出了问题,给出警告、并退出
  • 使用场景:一般只在开发测试启用断言正式部署后,则会将其关闭。

Assert的前世今生

Java 1.4 : assert 关键字

  • Java在1.4中引入Assert(断言)特性,有两种表达形式:
asset expression1;
asset expression1 : expression2; 
  • expression1为一个boolean表达式,expression2表示一个基本类型、表达式或者是一个Object。
  • 当expression1为false时,如果有expression2,则将expression2计算的结果作为错误信息输出。
  • 如果不存在expression2,则: 会抛出一个AssertionError对象。

junit : org.junit.Assert

  • 后来,在junit包中引入了Assert概念,并产生了一系列的重载方法。举几个例子:
//boolean 表达式为false,则抛出异常。
public static void assertTrue(java.lang.String message, boolean condition) { /* compiled code */ }
public static void assertTrue(boolean condition) { /* compiled code */ }

//比较两个值是否相等,不等则抛出异常。
public static void assertEquals(java.lang.String message, java.lang.Object expected, java.lang.Object actual) { /* compiled code */ }

//比较两个地址值是否相同,不同则抛出异常。
public static void assertSame(java.lang.String message, java.lang.Object expected, java.lang.Object actual) { /* compiled code */ }
public static void assertSame(java.lang.Object expected, java.lang.Object actual) { /* compiled code */ }

//详细使用会在后面的例子中讲解。
public static <T> void assertThat(T actual, org.hamcrest.Matcher<? super T> matcher) { /* compiled code */ }
public static <T> void assertThat(java.lang.String reason, T actual, org.hamcrest.Matcher<? super T> matcher) { /* compiled code */ }
  • 案例
//这是我的一个发送手机验证码的demo,返回是一个boolean值。可以通过assertTrue判断是否发送成功。
Assert.assertTrue(smsService.sendSMS("12345678912","123456"));

//判断查到的商品和预期的是否相同。注意:预期值在第一个参数。
Assert.assertEquals(expected,goodsDao.findById(id));
  • assertThat方法
  • assertThat方法,第2个参数是一个Matcher,在Junit4.4引入了Hamcrest框架,Hamcest提供了一套匹配符Matcher,这些匹配符更接近自然语言,可读性高,更加灵活;
  • 由于Hamcrest提供了大量的匹配符,结合它提供的匹配符,只用这一个方法,就可以实现所有可能需要的测试;
  • 参数中actual是需要测试的变量,matcher是匹配符和expected变量,与其他方法相比,这两个参数位置相反。
@Test
public void testAssertThat() {
	int expected = 10;
	int actual = 20;

	Assert.assertThat("unlikeness,you need look again", actual, equalTo(expected));
}

使用起来比较简单,重点是我们需要知道有哪些匹配符,下面将列举一些常用匹配符:

  • allOf 适用于多个条件的情况,所有条件必须满足才为true,和“与”类似;
  • anyOf 同样适用于多个条件的情况,有一个成立就为true,和“或”类似;
  • is 适用于单条件情况,相等则为true;
  • not 和is相反,不相等则为true;
  • containsString actual包含expected则为true;
  • endsWith actual以expected结尾则为true;
  • equalTo 可以测试数值、字符串、对象是否相等,与equals方法类似。相等则为true;
  • greaterThan 如果actual大于expected,则为true;
  • lessThan 如果actual小于expected,则为true;
  • hasItem 如果actual中含有元素expected,则为true;

总之,Junit4.4以后,使用assertThat几乎可以实现所有的可能性测试。参数位置也相对统一,只需要了解常用的匹配符,就可以轻松使用了。

spring : org.springframework.util.Assert*

  • 再后来,org.springframework.util包中也出现了类似的方法:
//是否为true,false则抛出异常。
public static void isTrue(boolean expression, java.lang.String message) { /* compiled code */ }
public static void isTrue(boolean expression) { /* compiled code */ }

//是否不为空,为空则抛出异常。
public static void notNull(@org.springframework.lang.Nullable java.lang.Object object, java.lang.String message) { /* compiled code */ }
public static void notNull(@org.springframework.lang.Nullable java.lang.Object object) { /* compiled code */ }

//当text为null或长度为0时,抛出异常。
public static void hasLength(@org.springframework.lang.Nullable java.lang.String text, java.lang.String message) { /* compiled code */ }
public static void hasLength(@org.springframework.lang.Nullable java.lang.String text) { /* compiled code */ }

//当集合未包含元素时,抛出异常。
public static void notEmpty(@org.springframework.lang.Nullable java.lang.Object[] array, java.lang.String message) { /* compiled code */ }
public static void notEmpty(@org.springframework.lang.Nullable java.lang.Object[] array) { /* compiled code */ }

//当text 为 null 或是一个空格的字符,抛出异常。
public static void hasText(@org.springframework.lang.Nullable java.lang.String text, java.lang.String message) { /* compiled code */ }
public static void hasText(@org.springframework.lang.Nullable java.lang.String text) { /* compiled code */ }

这里只是一些较为常见的方法,当传入message时,抛异常时会携带message信息。其他的原理相同,就不再解释了。

  • 案例
//此处用于判断接口传入参数payType是否正确。
Assert.isTrue(PayType.WeChatApp == payType || PayType.WeChatCode == payType, StringConst.stringByKey(strings.paramError));

//COLUMN_MAP为一个字符串数组
Assert.notEmpty(COLUMN_MAP);

X 参考文献

Assert(断言)的出现,极大的便利了我们的测试流程,在配合客户端调试代码时也可以在接口一开始使用断言来检查传递过来的参数格式是否正确。

标签:lang,code,Java,compiled,void,Assert,java,public,SE
From: https://www.cnblogs.com/johnnyzen/p/18277562

相关文章

  • Java Chassis 3技术解密,流式响应如何简化AI应用开发
    本文分享自华为云社区《JavaChassis3技术解密:流式响应和人工智能应用开发》,作者:liubao68。随着生成式人工智能技术的发展,应用程序开发者对于流式响应(StreamingResponses)的诉求越来越多。服务器事件推送(ServerPushEvents)技术能够在使用HTTP协议的前提下,提供流式响应能力......
  • Android系统之System Server大纲
    前言SystemServer是android基本服务的提供者,是android系统运行的最基本需求,所有server运行在一个叫system_process的进程中,system_process进程是androidjava虚拟机跑的第一个进程,从Zygote创建而来,是andorid系统最重要的java虚拟机。可以说,整个android系统的业务都是围绕syste......
  • CF631D Messenger (kmp + 字符串处理)
    CF631DMessengerkmp+字符串处理思路简单,写起来细节比较多首先要合并同类项,然后再考虑什么时候\(s=t\)。如果合并后\(t\)有一种或两种字符,那么都可以直接做;大于两种,我们发现匹配的条件为:中间部分完全相同,首尾字符相同并且\(s\)首尾字符的数量要大于\(t\)。中间部分完......
  • 【Java完整版 面试必备】Leetcode Top100题目和答案-哈希
    以下摘自leetcodeTop100精选题目-哈希1.两数之和给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那 两个 整数,并返回它们的数组下标。你可以假设每种输入只会对应一个答案。但是,数组中同一个元素在答案里不能重复出现。......
  • (免费领源码)java#Springboot#mysql物品代拿系统32500-计算机毕业设计项目选题推荐
    摘 要科技进步的飞速发展引起人们日常生活的巨大变化,电子信息技术的飞速发展使得电子信息技术的各个领域的应用水平得到普及和应用。信息时代的到来已成为不可阻挡的时尚潮流,人类发展的历史正进入一个新时代。在现实运用中,应用软件的工作规则和开发步骤,采用Java技术开发,Sp......
  • Java 说一下你熟悉的设计模式?
    在Java开发中,设计模式是常用的解决方案,用于解决软件设计中的常见问题。以下是一些常用的设计模式:创建型模式(CreationalPatterns)单例模式(SingletonPattern):确保一个类只有一个实例,并提供一个全局访问点。示例:publicclassSingleton{privatestaticSingletoni......
  • SSE使用详解
    一、SSE简介SSE是一种在网页开发中使用的、基于HTTP长连接技术,允许服务器向客户端浏览器实时推送更新。客户端通过创建一个EventSource对象并指向服务器上的一个URL来发起请求,这个请求保持打开状态,服务器可以在这个单一的TCP连接上不断发送新的数据块。这些数据块被称为“......
  • 千万别忽视基础!十张图带你一步步理解Java内存结构!
    作为一个Java程序员,在日常的开发中,不必像C/C++程序员那样,为每一个内存的分配而操心,JVM会替我们进行自动的内存分配和回收,方便我们开发。但是一旦发生内存泄漏或者内存溢出,如果对Java内存结构不清楚,那将会是一件非常麻烦的事情!本文笔者将为大家详解Java内存结构。面试tips聊聊......
  • webAPI连接SQLserver,并快速建立数据模型
    首先,你需要有一个webAPI来作为Android应用和SQLserver数据库之间的中间件,创建该api在项目中导入三个NuGet包通过服务器资源管理器连接数据库,获取数据库连接的字符串 快速建立数据模型思路:通过数据库创建数据类:导入包=>打开程序包管理器控制台=>选择项目=>Scaffold-DbCont......
  • 流量控制组件选型之 Sentinel vs Hystrix
    Sentinel:Sentinel是阿里中间件团队研发的面向分布式服务架构的轻量级高可用流量控制组件,于2018年7月正式开源。Sentinel主要以流量为切入点,从流量控制、熔断降级、系统负载保护等多个维度来帮助用户提升服务的稳定性。大家可能会问:Sentinel和之前经常用到的熔断降级库Ne......