6.1 断言
断言是可以插入代码不同位置的特殊检查。他们的任务是确定出了什么问题。或者更确切地说,检查一切是否按预期进行。这是“根据需要”,它们允许您以各种方式进行设置。
您已经在上面的代码中遇到过一些断言。第一个是检查对象是否相等。如果对象不相等,将抛出异常并且测试将失败。
比较的顺序在这里很重要,因为最终报告中的 JUnit 会写类似“收到值 1,但预期为 3”的内容。这种检查的一般格式是:
assertEquals(standard , meaning)
例子:
@Test
public void whenAssertingEquality () {
String expected = "3.1415";
String actual = "3";
assertEquals(expected, actual);
}
6.2 方法 assertEquals、assertTrue、assertFalse
下面我将列出最流行的方法——断言。通过它们的名字很可能猜出它们是如何工作的。但无论如何我都会写一个简短的解释:
断言等于 | 检查两个对象是否相等 |
---|---|
断言数组相等 | 检查两个数组是否包含相等的值 |
assertNotNull | 检查参数是否不为空 |
断言为空 | 检查参数是否为空 |
断言不相同 | 检查两个参数不是同一个对象 |
断言相同 | 检查两个参数是否是同一个对象 |
断言为真 | 检查参数是否为真 |
断言假 | 检查参数是否为假 |
其中一些方法似乎是多余的。既然可以写assertTrue(a == b) ,为什么还要使用assertSame( a, b)呢?
关键是assert是一种非常聪明的方法。它做了很多有用的事情,包括将错误信息写入日志。在第一种情况下,它会写 object A was expected, but object B was received. 在第二种情况下,它会简单地写成 true was expected 。
当您有数百个测试时,尤其是那些在专用测试服务器上运行的测试,拥有详细的日志会非常有帮助。我想你明白我的意思。
数组比较示例:
@Test
public void whenAssertingArraysEquality() {
char[] expected = {'J','u','n','i','t'};
char[] actual = "Junit".toCharArray();
assertArrayEquals(expected, actual);
}
6.3 assertAll 方法
上面说了,assert方法不仅进行检查,还会向日志中写入很多可比对象的信息。
我们来做个比较:
Address address = unitUnderTest.methodUnderTest();
assertEquals("Washington", address.getCity());
assertEquals("Oracle Parkway", address.getStreet());
assertEquals("500", address.getNumber());
但如果其中一个参数不匹配,则不会检查其余参数。但我希望它们仍然发生,并将它们的结果记录在日志中。但与此同时,如果至少有一项检查失败,则测试仍然失败。
为此有一个特殊的方法 - assertAll()。作为第一个参数,它需要一条要写入日志的注释,然后是任意数量的断言函数。
下面是我们的示例将如何用它重写:
Address address = unitUnderTest.methodUnderTest();
assertAll("Complex address comparison script",
() -> assertEquals("Washington", address.getCity()),
() -> assertEquals("Oracle Parkway", address.getStreet()),
() -> assertEquals("500", address.getNumber())
);
然后如果地址不正确,日志中将写入如下内容:
Complex scenario comparison address (3 failures)
expected: <Washington> but was: <Seattle>
expected: <Oracle Parkway> but was: <Main Street>
expected: <500> but was: <5772>
6.4 assertTimeout方法
还记得@Timeout注释吗?它允许控制整个方法的执行时间。但有时对方法内部某些部分代码的执行设置限制是有用的。您可以为此使用assertTimeout()。
时间作为第一个参数传递,必须在指定时间内执行的代码(函数)作为第二个参数传递。例子:
@Test
public void whenAssertingTimeout() {
assertTimeout(
ofSeconds(2),
() -> {
// pause for one second
Thread.sleep(1000);
}
);
}
Assert类有assertTimeout()方法的 12 种变体。如果你想了解更多关于它们的信息,欢迎阅读官方文档。
6.5 assertThrows 方法
很多情况下,您需要确保在特定情况下代码抛出正确的异常:它检测到错误并抛出正确的异常。这是一种很常见的情况。
在这种情况下,还有另一个有用的断言方法——这是assertThrows()。其调用的一般格式为:
assertThrows(exception , code)
基本上,它与assertTimeout()方法非常相似,只是它检查指定的代码是否抛出正确的异常。例子:
@Test
void whenAssertingException() {
Throwable exception = assertThrows(
IllegalArgumentException.class,
() -> {
throw new IllegalArgumentException("Exception message");
}
);
assertEquals("Exception message", exception.getMessage());
}
GO TO FULL VERSION