断言是编写单元测试用例的核心方式,即期望值是多少,测试的结果是多少,以此来判断测试是否通过。在JUnit Jupiter中,所有的断言都是org.junit.jupiter.api.Assertions
类中static方法。
例如:
class AssertTest {
@Test
fun succeedingTest() {
Assertions.assertAll("AssertAll Heading", Executable {
val aa = "10".toInt()
})
// 断言期望的和实际的XX类型是相等的。
// 若失败,将显示提供的失败消息。
Assertions.assertArrayEquals(arrayOf(1, 2, 3), arrayOf(1, 2, 3), "用来测试数组相等断言")
Assertions.assertDoesNotThrow {
val aa = "10".toInt()
}
// 断言预期和实际是相等的。
// 如有必要,将从提供的messageSupplier中懒惰地检索失败消息。
val a = 10
Assertions.assertEquals(10, a, "测试Assert Equals")
// 断言提供的条件不是真。
// 失败并显示提供的失败消息。
val aa = 20
Assertions.assertFalse(aa < 10, "测试 assertFalse")
// 断言预期和实际的迭代是完全相同的。
// 如果遇到两个迭代(包括期望和实际),则它们的迭代器必须以相同的顺序返回相等的元素。
// 这意味着迭代器不需要是同一类型。
val i0 = ArrayList(Arrays.asList(1, 2, 3))
val i1 = LinkedList(Arrays.asList(1, 2, 3))
Assertions.assertIterableEquals(i0, i1)
// 断言实际不为null
Assertions.assertNotNull(10, "Test Assert Not Null")
// 断言预期和实际不会引用同一个对象
val aList = listOf()
val bList = mapOf()
Assertions.assertNotSame(aList, bList, "Test Assert Not Same")
// 断言预期和实际引用同一个对象
val cList = aList
Assertions.assertSame(aList, cList, "Test assertSame")
// 断言提供的实际为null
var aNull: Int? = null
Assertions.assertNull(aNull, "Test Assert Null")
// 断言所提供的可执行代码块的执行会引发expectedType的异常并返回异常。
// 如果没有抛出异常,或者抛出了不同类型的异常,则此方法将失败。
// 如果不想对异常实例执行其他检查,只需忽略返回值。
Assertions.assertThrows(AException::class.java) {
throw AException()
}
// 断言在超出给定超时之前,所提供的可执行代码块的执行完成。
// 可执行代码块将在与调用代码相同的线程中执行。
// 因此,如果超过超时,则不会抢先中止执行可执行代码块.
// 也就是说,即使超时,代码块也会执行完
Assertions.assertTimeout(Duration.ofSeconds(3), {
println("assertTimeout Start -->")
Thread.sleep(5000)
println("--> assertTimeout End")
}, "Test assertTimeOut")
}
@Test
fun failingAssertAllTest() {
// 断言所有提供的可执行文件,不再抛出异常。
// 提供的标题将包含在MultipleFailuresError的消息字符串中。
Assertions.assertAll("AssertAll Heading", Executable {
val aa = "aaa".toInt()
})
}
@Test
fun failingAssertArrayEquals() {
// 断言期望的和实际的XX类型是相等的。
// 若失败,将显示提供的失败消息。
Assertions.assertArrayEquals(arrayOf(1, 2, 3), arrayOf(1, 2, 3, 4), "用来测试数组相等断言")
}
@Test
fun failingAssertDoesNotThrow() {
// 虽然从测试方法抛出的任何异常都会导致测试失败,
// 但在某些用例中,显式断言测试方法中的给定代码块不会抛出异常会很有用。
// 提供的标题将包含在MultipleFailuresError的消息字符串中。
Assertions.assertDoesNotThrow({
val aa = "aaa".toInt()
}, "This is a Assert Does Not Throw Test")
}
@Test
fun failingAssertEquals() {
val a = 10
// 断言预期和实际是相等的。
// 如有必要,将从提供的messageSupplier中懒惰地检索失败消息。
Assertions.assertEquals(20, a, "测试 assertEquals")
}
@Test
fun failingAssertFalse() {
// 断言提供的条件不是真。
// 失败并显示提供的失败消息
Assertions.assertFalse({
val aa = 10
aa > 5
}, "测试 Assert False")
}
@Test
fun failingAssertIterable() {
val i0 = ArrayList(Arrays.asList(1, 2, 3))
val i1 = LinkedList(Arrays.asList('A', 'B', 'C'))
// 断言预期和实际的迭代是完全相同的。
// 如果遇到两个迭代(包括期望和实际),则它们的迭代器必须以相同的顺序返回相等的元素。
// 这意味着迭代器不需要是同一类型。
Assertions.assertIterableEquals(i0, i1, "Test assertIterable")
}
@Test
fun failAssertNotNull() {
// 断言提供的条件不为null
Assertions.assertNotNull(null, "Test assertNotNull")
}
@Test
fun failingNotSame() {
// 断言预期和实际不会引用同一个对象
val a = listOf()
val c = a
Assertions.assertNotSame(a, c, "Test assertNotSame")
}
@Test
fun failingAssertNull() {
// 断言提供的实际为null, 其默认预期值为null
Assertions.assertNull(10, "Test assertNull")
}
@Test
fun failingAssertSame() {
// 断言预期和实际不会引用同一个对象
// 注意:在List中,泛型的擦除效应
val a = listOf()
val b = mapOf()
Assertions.assertSame(a, b, "Test assertSame")
}
@Test
fun failingAssertThrows() {
// 断言所提供的可执行代码块的执行会引发expectedType的异常并返回异常。
// 如果没有抛出异常,或者抛出了不同类型的异常,则此方法将失败。
// 如果不想对异常实例执行其他检查,只需忽略返回值。
Assertions.assertThrows(AException::class.java) {
val aa = Random()
val b = aa.nextInt()
if (b > 10) {
println("b: $b")
} else {
throw BException()
}
}
}
@Test
fun failingAssertTimeout() {
// 断言在超出给定超时之前,所提供的可执行代码块的执行完成。
// 可执行代码块将在与调用代码相同的线程中执行。
// 因此,如果超过超时,则不会抢先中止执行可执行代码块.
// 也就是说,即使超时,代码块也会执行完
Assertions.assertTimeout(Duration.ofSeconds(3), {
println("assertTimeout Start -->")
Thread.sleep(5000)
println("--> assertTimeout End")
}, "Test assertTimeOut")
}
@Test
fun failingAssertTimeoutPreemptively() {
// 断言在超出给定超时之前,所提供的可执行代码块的执行完成。'
// 可执行代码块将在与调用代码不同的线程中执行。
// 如果超过超时,则可抢占地执行可执行代码块。
// 也就是说,如果超时,代码块不会执行完
Assertions.assertTimeoutPreemptively(Duration.ofSeconds(3), {
println("assertTimeout Start -->")
Thread.sleep(5000)
println("--> assertTimeout End")
}, "Test assertTimeoutPreemptively")
}
@Test
fun failingAssertTrue() {
// 断言提供的条件为true
Assertions.assertTrue({
val random = Random()
val b = random.nextInt()
b > 10
}, "Test assertTrue")
}
@Test
fun testFail() {
Assertions.fail("这是一次失败的测试")
}
}
在JUnit5中,断言提供了对Java 8 Lambda的支持,更便于使用断言。例如:
Assertions.assertTimeoutPreemptively(Duration.ofSeconds(3), {
println("assertTimeout Start -->")
Thread.sleep(5000)
println("--> assertTimeout End")
}, "Test assertTimeoutPreemptively")