assertJava中用于做校验的一个关键字,类似于if,但assert并不具备分支逻辑,而是当断言表达式为真时继续,**为假时抛出错误^[java.lang.AssertionError]**。

使用举例:

1
assert 1 > 2 : "1怎么会大于2";

打印结果为:

1
2
Exception in thread "main" java.lang.AssertionError: 1怎么会大于2
at study.verlif.test.Main.main(Main.java:6)

开启断言

当你准备测试,在程序中写入assert 1 > 2 : "1怎么会大于2";并运行时,你会发现什么都没有发生,这是因为Java断言是关闭的,需要通过JVM参数开启(-enableassertions-ea)。

例如:java -jar -ea assertTest.jar

或是通过IDEA的运行配置进行测试:

运行配置

书写断言

断言格式为assert [断言表达式] : [失败描述],也可以assert [断言表达式]不写描述^[有些包提供了静态方法方便开发者以方法的方式进行书写,例如JUintSpringframework,其中的实现逻辑也不相同]。

其中断言表达式只能是一个返回true或是false的语句,包括判断语句方法boolean属性变量

1
2
3
4
5
6
7
boolean a = true;
// 断言1
assert a : "a怎么能是false呢?";
// 断言2
assert isNormal();
// 断言3
assert 1 > 2 : "1怎么会大于2!";

对于以上代码,其中断言1为真,不产生动作;断言2按照isNormal()运行结果来判断是否抛出错误;当断言2为真时断言3会直接抛出AssertionError错误

AssertionError错误

AssertionError继承于Error,而Error继承于Throwable,这三者都属于java.lang包下。

AssertionError继承关系

使用场景

断言使用场景非常局限,因为其抛出错误的机制导致了判断逻辑的重要性,基本上不会出现在正式环境下,但是测试环境倒是很常用。

一般使用JUnit的时候,我们需要判断我们编写的功能或代码片段是否按期运行就会用到判断逻辑。单元测试下的判断逻辑一般就只会用来判断结果是否符合预期,不用做分支处理,此时使用assert就非常合适,而不是写一堆if (!condition) throw new RuntimeException("结果错误");


本站总访问量