业务场景: 当我们需要对一个接口方法验证是,在单元测试中,主要用于程序代码的调试或测试阶段
基本的使用就是
assert condition
,当 condition 为 true,就继续往下运行;当 condition 为 false,就抛出一个错误,程序停止。
- 注意断言抛出的是错误,我们是无法使用
try{}catch(){}
捕捉的。 - 限定某段代码中某个变量的合理范围,一旦不符合就抛出错误,需要让程序员再修改代码。表达式结果等同理。
简单记录下 今天用到的这个断言,主要是判断了一个对象是否为空,业务逻辑上是需要这个对象值不能为空的,单元测试简单做了下验证
断言常用的方法
- notNull(Object object) 当 object 不为 null 时抛出异常,notNull(Object object, String message) 方法允许您通过 message 定制异常信息。和 notNull() 方法断言规则相反的方法是 isNull(Object object)/isNull(Object object, String message),它要求入参一定是 null;
- isTrue(boolean expression) / isTrue(boolean expression, String message) 当 expression 不为 true 抛出异常;
- notEmpty(Collection collection) / notEmpty(Collection collection, String message) 当集合未包含元素时抛出异常。notEmpty(Map map) / notEmpty(Map map, String message) 和 notEmpty(Object[] array, String message) / notEmpty(Object[] array, String message) 分别对 Map 和 Object[] 类型的入参进行判断;
- hasLength(String text) / hasLength(String text, String message) 当 text 为 null 或长度为 0 时抛出异常;
- hasText(String text) / hasText(String text, String message) text 不能为 null 且必须至少包含一个非空格的字符,否则抛出异常;
- isInstanceOf(Class clazz, Object obj) / isInstanceOf(Class type, Object obj, String message) 如果 obj 不能被正确造型为 clazz 指定的类将抛出异常;
- isAssignable(Class superType, Class subType) / isAssignable(Class superType, Class subType, String message) subType 必须可以按类型匹配于 superType,否则将抛出异常;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.util.Assert;
public class Test {
private final static Logger logger = LoggerFactory.getLogger(Test.class);
public static void main(String[] args) {
Test test = new Test();
test.f1();
}
public void f1() {
try {
// String s1 = null;//hasText,notNull,hasLength均报异常
// String s1 = "";//hasText报异常,notNull不报异常,hasLength报异常
// String s1 = " ";//一个空格,hasText报异常,notNull不报异常,hasLength不报异常
// String s1 = " ";//三个空格,hasText报异常,notNull不报异常,hasLength不报异常
String s1 = "s";//hasText,notNull,hasLength均不报异常
Assert.hasText(s1, "hasText,s1不能为空,当前为空已抛出异常");
Assert.notNull(s1, "notNull,s1不能为空,当前为空已抛出异常");
Assert.hasLength(s1, "hasLength,s1不能为空,当前为空已抛出异常");
Assert.isTrue(1 < 2, "1<2需要为true");//不报异常
Assert.isTrue(1 > 2, "1<2需要为true");//报异常
Assert.isInstanceOf(String.class,s1);//不报异常
Assert.isInstanceOf(Object.class,s1);//不报异常
Assert.isInstanceOf(Integer.class,s1);//报异常
Assert.isAssignable(String.class,s1.getClass(),"s1需要是String类型的子类");//不报异常
Assert.isAssignable(String.class,new Integer(1).getClass(),"s1需要是String类型的子类");//报异常
Assert.isAssignable(Object.class,s1.getClass(),"s1需要是Object类型的子类");//不报异常
Assert.isAssignable(String.class,new Object().getClass(),"subType需要是superType的子类");//报异常
} catch (Exception e) {
logger.error(e.getMessage());
}
logger.info("运行正常");
}
}
//Assert.notNull:只有输入空,才会报异常;输入空字符比如""、空格不报异常;
//Assert.hasLength:如果输入空、空字符报异常;输入空格不报异常;
//Assert.hasText:只有输入空、空字符比如""、空格或多个空格都会报异常;(不把空格算作内容)
//校验的越来越严格