什么是Assert
Assert,也叫断言,写代码时,我们可以预先进行假设一些正常时不应该发生的情况,断言就是用于在代码中捕捉这些假设,在发生这些假设的情况时,给出警告并退出,可以将断言看作是异常处理的一种高级形式。
Assert其实就是对一个boolean表达式进行判断,为true时程序继续运行,为false时,则表示程序出了问题,给出警告并退出。所以,我们一般只在开发和测试时启用断言,正式部署以后则会将其关闭。
Assert的前世今生
Java在1.4中引入Assert(断言)特性,有两种表达形式:
asset expression1;
asset expression1 : expression2;
expression1为一个boolean表达式,expression2表示一个基本类型、表达式或者是一个Object,当expression1为false时,如果有expression2,则将expression2计算的结果作为错误信息输出。如果不存在expression2,则会抛出一个AssertionError对象。
后来,在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 */ }
再后来,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信息。其他的原理相同,就不再解释了。
使用示例
下面将展示一些基础使用方法,首先是junit包中的Assert:
//这是我的一个发送手机验证码的demo,返回是一个boolean值。可以通过assertTrue判断是否发送成功。
Assert.assertTrue(smsService.sendSMS("12345678912","123456"));
//判断查到的商品和预期的是否相同。注意:预期值在第一个参数。
Assert.assertEquals(expected,goodsDao.findById(id));
接下来是org.springframework.util包中的Assert方法,使用大同小异:
//此处用于判断接口传入参数payType是否正确。
Assert.isTrue(PayType.WeChatApp == payType || PayType.WeChatCode == payType,
StringConst.stringByKey(strings.paramError));
//COLUMN_MAP为一个字符串数组
Assert.notEmpty(COLUMN_MAP);
使用比较简单,就不再解释了。
assertThat方法
- assertThat方法,第二个参数是一个Matcher,在Junit4.4引入了Hamcrest框架,Hamcest提供了一套匹配符Matcher,这些匹配符更接近自然语言,可读性高,更加灵活;
- 由于Hamcrest提供了大量的匹配符,结合它提供的匹配符,只用这一个方法,就可以实现所有可能需要的测试;
- 参数中actual是需要测试的变量,matcher是匹配符和expected变量,与其他方法相比,这两个参数位置相反。
举个栗子,熟悉一下assertThat的使用:
@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几乎可以实现所有的可能性测试。参数位置也相对统一,只需要了解常用的匹配符,就可以轻松使用了。
总结
Assert(断言)的出现,极大的便利了我们的测试流程,在配合客户端调试代码时也可以在接口一开始使用断言来检查传递过来的参数格式是否正确。
以上便是我对断言的一些理解,如果有什么错误或者建议的,欢迎评论或者私信我,谢谢各位!