spring Assert教程(转)

Assert类目的

Spring Assert类帮助我们校验参数。通过使用Assert类方法,我们可以写出我们认为是正确的假设,反之,会抛出运行时异常。

每个Assert的方法可以与java assert表达式进行比较。java assert表达式在运行时如果条件校验失败,则抛出Error,有趣的是,这些断言可以被禁用。

Spring Assert的方法有一些特点:

  • 都是static方法
  • 抛出IllegalArgumentException 或 IllegalStateException异常
  • 第一个参数通常是需验证的对象或逻辑条件
  • 最后参数通常是异常消息,用于验证失败时显示
  • 消息可以作为String参数或Supplier 参数传输

尽管Spring Assert与其他框架的名称类似,如JUnit或其他框架,但其实没有任何共同之处。Spring Assert不是为了测试,而是为了调试。

使用示例

让我们定义Car类,并有public方法drive():

public class Car {
    private String state = "stop";

    public void drive(int speed) {
        Assert.isTrue(speed > 0, "speed must be positive");
        this.state = "drive";
        // ...
    }
}

我们看到speed必须是正数,上面一行简短的代码用于检测条件,如果失败抛出异常:

if (!(speed > 0)) {
    throw new IllegalArgumentException("speed must be positive");
}
每个Assert的方法包含大概类似上面的条件代码块,校验失败抛出运行时异常,应用程序不期望恢复。
如果我们尝试带负数参数调用drive方法,会抛出IllegalArgumentException异常:
Exception in thread "main" java.lang.IllegalArgumentException: speed must be positive
逻辑断言
isTrue()

上面已经看到示例,其接受布尔条件,如果条件为假抛出IllegalArgumentException 异常。

state()

该方法与isTrue一样,但抛出IllegalStateException异常。

如名称所示,通常用在因对象的非法状态时,方法不能继续执行。假设骑车运行是不能加油,我们可以使用state方法断言:

public void fuel() {
    Assert.state(this.state.equals("stop"), "car must be stopped");
    // ...
}

当然,我们能使用逻辑断言验证所有场景。但为了更好的可读性,我们可以使用其他的断言,使代码表达性更好。

对象和类型断言
notNull()

通过notNull()方法可以假设对象不null:

public void сhangeOil(String oil) {
    Assert.notNull(oil, "oil mustn't be null");
    // ...
}
isNull()

另外一方面,我们能使用isNull()方法检查对象为null:

public void replaceBattery(CarBattery carBattery) {
    Assert.isNull(
      carBattery.getCharge(), 
      "to replace battery the charge must be null");
    // ...
}
isInstanceOf()

使用isInstanceOf()方法检查对象必须为另一个特定类型的实例:

public void сhangeEngine(Engine engine) {
    Assert.isInstanceOf(ToyotaEngine.class, engine);
    // ...
}

示例中,ToyotaEngine 是类 Engine的子类,所以检查通过.

isAssignable()

使用Assert.isAssignable()方法检查类型:

public void repairEngine(Engine engine) {
    Assert.isAssignable(Engine.class, ToyotaEngine.class);
    // ...
}

这两个断言代表 is-a 关系.

文本断言

通常用来检查字符串参数。

hasLength()

如果检查字符串不是空符串,意味着至少包含一个空白,可以使用hasLength()方法:

public void startWithHasLength(String key) {
    Assert.hasLength(key, "key must not be null and must not the empty");
    // ...
}
hasText()

我们能增强检查条件,字符串至少包含一个非空白字符,可以使用hasText()方法:

public void startWithHasText(String key) {
    Assert.hasText(
      key, 
      "key must not be null and must contain at least one non-whitespace  character");
    // ...
}
doesNotContain()

我们能通过doesNotContain()方法检查参数不包含特定子串:

public void startWithNotContain(String key) {
    Assert.doesNotContain(key, "123", "key mustn't contain 123");
    // ...
}
Collection和map断言
Collection应用notEmpty()

如其名称所示,notEmpty()方法断言collection不空,意味着不是null并包含至少一个元素:

public void repair(Collection<String> repairParts) {
    Assert.notEmpty(
      repairParts, 
      "collection of repairParts mustn't be empty");
    // ...
}
map应用notEmpty()

同样的方法重载用于map,检查map不null,并至少包含一个entry(key,value键值对):

public void repair(Map<String, String> repairParts) {
    Assert.notEmpty(
      repairParts, 
      "map of repairParts mustn't be empty");
    // ...
}
数组断言
notEmpty()

notEmpty()方法可以检查数组不null,且至少包括一个元素:

public void repair(String[] repairParts) {
    Assert.notEmpty(
      repairParts, 
      "array of repairParts mustn't be empty");
    // ...
}
noNullElements()

noNullElements()方法确保数组不包含null元素:

public void repairWithNoNull(String[] repairParts) {
    Assert.noNullElements(
      repairParts, 
      "array of repairParts mustn't contain null elements");
    // ...
}

注意,如果数组为空检查可以通过,只要没有null元素。

总结

我们浏览Assert类,在spring框架中应用广泛,充分利用它可以很容易写出强壮的代码。

Leave a Reply

Your email address will not be published. Required fields are marked *

lWoHvYe 无悔,专一