JUnit5-断言

本文详细介绍了JUnit5中的断言方法,如assertAll、assertArrayEquals、assertDoesNotThrow、assertEquals等,强调了断言在单元测试中的重要性,并展示了如何利用Java 8 Lambda简化断言操作。

断言是编写单元测试用例的核心方式,即期望值是多少,测试的结果是多少,以此来判断测试是否通过。在JUnit Jupiter中,所有的断言都是org.junit.jupiter.api.Assertions 类中static方法。

  • assertAll:断言所有提供的可执行文件都不会抛出异常。若提供的标题(heading),其将包含在MultipleFailuresError的消息字符串中。
  • assertArrayEquals:断言期望的和实际的XX类型数组是相等的。若失败,将显示提供的失败消息。
  • assertDoesNotThrow:虽然从测试方法抛出的任何异常都会导致测试失败,但在某些用例中,显式断言测试方法中的给定代码块不会抛出异常会很有用。若提供的标题(heading),其将包含在MultipleFailuresError的消息字符串中。
  • assertEquals:断言预期和实际是相等的。如有必要,将从提供的messageSupplier中懒惰地检索失败消息。
  • assertFalse:断言提供的条件不是真。失败并显示提供的失败消息。
  • assertIterableEquals:断言预期和实际的迭代是完全相同的。类似于检查assertArrayEquals(Object [],Object [],String)中的完全相等,如果遇到两个迭代(包括期望和实际),则它们的迭代器必须以相同的顺序返回相等的元素。注意:这意味着迭代器不需要是同一类型。
  • assertNotNull:断言提供的条件不为null
  • assertNotSame:断言预期和实际不会引用同一个对象
  • assertNull:断言提供的实际为null
  • assertSame:断言预期和实际引用同一个对象
  • assertThrows:断言所提供的可执行代码块的执行会引发expectedType的异常并返回异常。如果没有抛出异常,或者抛出了不同类型的异常,则此方法将失败。如果不想对异常实例执行其他检查,只需忽略返回值。
  • assertTimeout:断言在超出给定超时之前,所提供的可执行代码块的执行完成。注意:可执行代码块将在与调用代码相同的线程中执行。因此,如果超过超时,则不会抢先中止执行可执行代码块。
  • assertTimeoutPreemptively:断言在超出给定超时之前,所提供的可执行代码块的执行完成。注意:可执行代码块将在与调用代码不同的线程中执行。此外,如果超过超时,则可抢占地执行可执行代码块。
  • assertTrue:断言提供的条件为true
  • fail:使用给定的失败消息以及根本原因进行测试失败。泛型返回类型V允许此方法直接用作单语句lambda表达式,从而避免需要实现具有显式返回值的代码块。 由于此方法在其return语句之前抛出AssertionFailedError,因此该方法实际上永远不会向其调用者返回值。

例如:

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 Equal
### JUnit-Jupiter 和 JUnit-Jupiter-API 的主要区别 JUnit 5 是一个模块化的测试框架,其核心由多个模块组成,其中 `junit-jupiter` 和 `junit-jupiter-api` 是两个重要的模块。以下是它们之间的主要区别: #### ### 1. 模块定义与功能划分 - **JUnit-Jupiter-API** `junit-jupiter-api` 是 JUnit Jupiter 的 API 模块,提供了编写测试所需的所有注解和断言方法。它包含诸如 `@Test`、`@BeforeEach`、`@AfterEach` 等注解以及断言工具类(如 `Assertions` 和 `Assumptions`)。这个模块仅提供 API,不包含运行测试的逻辑[^1]。 - **JUnit-Jupiter** `junit-jupiter` 是一个聚合模块,包含了 `junit-jupiter-api` 和 `junit-jupiter-engine`。它是一个方便的依赖项,用于同时引入 API 和引擎,使得开发者可以轻松地编写和运行测试[^1]。 #### ### 2. 测试运行支持 - **JUnit-Jupiter-API** 单独引入 `junit-jupiter-api` 时,可以编写测试代码,但无法直接运行测试,因为缺少测试引擎的支持。测试引擎负责实际执行测试用例[^1]。 - **JUnit-Jupiter** 引入 `junit-jupiter` 后,不仅能够编写测试,还可以通过内置的 `junit-jupiter-engine` 来运行测试。这意味着它是一个完整的解决方案,既包括 API 又包括运行时支持。 #### ### 3. 依赖关系 - **JUnit-Jupiter-API** 它是 `junit-jupiter` 的一部分,但本身并不依赖于其他模块。因此,如果只需要编写测试而不运行,可以选择单独使用 `junit-jupiter-api`。 - **JUnit-Jupiter** 它依赖于 `junit-jupiter-api` 和 `junit-jupiter-engine`,是一个更高层次的抽象,适合大多数开发场景[^1]。 #### ### 示例 Maven 配置 以下是使用 `junit-jupiter-api` 和 `junit-jupiter` 的 Maven 配置示例: ```xml <!-- 仅引入 API --> <dependency> <groupId>org.junit.jupiter</groupId> <artifactId>junit-jupiter-api</artifactId> <version>5.9.3</version> <scope>test</scope> </dependency> <!-- 引入完整模块 --> <dependency> <groupId>org.junit.jupiter</groupId> <artifactId>junit-jupiter</artifactId> <version>5.9.3</version> <scope>test</scope> </dependency> ``` #### ### 示例代码对比 以下展示了如何使用 `junit-jupiter-api` 编写测试,以及需要 `junit-jupiter-engine` 才能运行测试: ```java // 使用 junit-jupiter-api 编写的测试 import org.junit.jupiter.api.Test; import static org.junit.jupiter.api.Assertions.assertEquals; public class ExampleTest { @Test public void testAddition() { assertEquals(2, 1 + 1, "1 + 1 should equal 2"); } } ``` 如果没有引入 `junit-jupiter-engine`,上述测试将无法运行,因为缺少执行测试的逻辑[^1]。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值