断言的概念

断言实际上是一种测试机制,它可以规定某个参数或者属性必须要满足某个条件,否则会抛出一个异常,并且程序会中止。

断言的一些特点

  • 断言只用于开发测试阶段确定程序的内部错误
  • 断言默认是禁用的,需要手动开启。禁用断言的情况下,类加载器会跳过断言代码
  • 断言检测失败的时候,会抛出 AssertionError 异常,程序中止

断言的实例

断言是通过关键字 assert 实现的,这个关键字有两种形式

  • assert expression1

  • assert expression1 : expression2

在两种表达式中,expression1 表示一个 boolean 表达式, expression2 表示一个基本类型或者是一个对象(Object),由于所有类都为 Object 的子类,因此这个参数可以用于所有对象。

断言会返回一个布尔值,表示代码行为是否符合预期。测试用例之中,只要有一个断言为 false,这个测试用例就会失败,只有所有断言都为 true,测试用例才会通过。

assert expression1 : expression2 这种形式中,表达式会被传入 AssertionError 的构造器,并将表达式转换成一个消息字符串。如果条件的检测结果为 true,则程序正常运行。

实例

平时做判断通常都是这样写

1
2
3
if (message == null || message.equls("")) {
throw new IllegalArgumentException("输入信息错误!");
}

用 Assert 工具类上面的代码可以简化为:

1
Assert.hasText((message), "输入信息错误!");

Assert 的工具类

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
@Slf4j
public abstract class Assert {


/**
* 断言表达式为真
* 如果不为真,则抛出异常
*
* @param expression
* @param msg
*/
public static void isTrue(boolean expression, String msg) {
if (!expression) {
log.info("fail...............");
}
}


/**
* 断言两个对象不相等
* 如果相等,则抛出异常
*
* @param m1
* @param m2
* @param msg
*/
public static void notEquals(Object m1, Object m2, String msg) {
if (m1.equals(m2)) {
log.info("equals...............");
}
}


/**
* 断言两个对象相等
* 如果不相等,则抛出异常
*
* @param m1
* @param m2
* @param msg
*/
public static void equals(Object m1, Object m2, String msg) {
if (!m1.equals(m2)) {
log.info("not equals...............");
}
}

/**
* 断言参数不为空
* 如果为空,则抛出异常
*
* @param s
* @param msg
*/
public static void notEmpty(String s, String msg) {
if (StringUtils.isEmpty(s)) {
log.info("is empty...............");
}
}
}