Spring断言语句

2023/05/13

1. 概述

在本教程中,我们将重点介绍和描述Spring Assert类的用途,并演示如何使用它。

2. Assert类的目的

Spring Assert类帮助我们验证参数,通过使用Assert类的方法,我们可以编写我们期望为true的假设。如果不满足,则会抛出运行时异常。

每个Assert的方法都可以与Java assert语句进行比较。Java assert语句在其条件失败时会在运行时抛出一个错误。有趣的是,这些断言可以被禁用。

以下是Spring Assert方法的一些特征:

  • Assert的方法是静态的
  • 他们抛出IllegalArgumentException或IllegalStateException
  • 第一个参数通常是用于验证的参数或要检查的逻辑条件
  • 最后一个参数通常是验证失败时显示的异常消息
  • 消息可以作为String参数或Supplier<String>参数传递

另请注意,尽管名称相似,但Spring断言与JUnit和其他测试框架的断言没有任何共同之处。Spring断言不是用于测试,而是用于调试。

3. 使用示例

让我们用公共方法drive()定义一个Car类:

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

	public void drive(int speed) {
		Assert.isTrue(speed > -1, "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

4. 逻辑断言

4.1 isTrue()

上面讨论了这个断言,它接收布尔条件并在条件为false时抛出IllegalArgumentException。

4.2 state()

state()方法与isTrue()具有相同的签名,但抛出IllegalStateException

顾名思义,当由于对象的非法状态而不能继续该方法时,应该使用它。

想象一下,如果汽车正在运行,我们不能调用fuel()方法。让我们在这种情况下使用state()断言:

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

当然,我们可以使用逻辑断言来验证一切。但是为了更好的可读性,我们可以使用额外的断言来使我们的代码更具表现力。

5. 对象和类型断言

5.1 notNull()

我们可以使用notNull()方法假设一个对象不为空:

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

5.2 isNull()

另一方面,我们可以使用isNull()方法检查对象是否为空:

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

5.3 isInstanceOf()

要检查一个对象是否是特定类型的另一个对象的实例,我们可以使用isInstanceOf()方法:

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

在我们的示例中,检查成功通过,因为ToyotaEngine是Engine的子类。

5.4 isAssignable()

要检查类型,我们可以使用Assert.isAssignable():

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

最近的两个断言表示一种is-a关系。

6. 文本断言

文本断言用于对字符串参数执行检查。

6.1 hasLength()

我们可以使用hasLength()方法检查一个String是否不为空,这意味着它至少包含一个空格:

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

6.2 hasText()

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

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

6.3 doesNotContain()

我们可以使用doesNotContain()方法来确定 字符串参数是否不包含特定的子字符串:

public void startWithNotContain(String key) {
    Assert.doesNotContain(key, "123", "key mustn't contain 123");
    // ...
}

7. 集合和Map断言

7.1 notEmpty()用于集合

顾名思义,notEmpty()方法断言集合不为空,这意味着它不为空并且至少包含一个元素:

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

7.2 notEmpty()用于Map

Map重载了相同的方法,我们可以检查Map是否不为空并且至少包含一个条目:

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

8. 数组断言

8.1 数组的notEmpty()

最后,我们可以使用notEmpty()方法检查数组是否不为空并且至少包含一个元素:

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

8.2 noNullElements()

我们可以使用noNullElements()方法验证数组不包含空元素:

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

请注意,如果数组为空,只要其中没有空元素,此检查仍会通过。

9. 总结

在本文中,我们探讨了Assert类。这个类在Spring框架中被广泛使用,但我们可以轻松地利用它编写更健壮和更具表现力的代码。

与往常一样,本教程的完整源代码可在GitHub上获得。

Show Disqus Comments

Post Directory

扫码关注公众号:Taketoday
发送 290992
即可立即永久解锁本站全部文章