企业🤖AI智能体构建引擎,智能编排和调试,一键部署,支持私有化部署方案 广告
# JUnit5 与 JUnit4 > 原文: [https://howtodoinjava.com/junit5/junit-5-vs-junit-4/](https://howtodoinjava.com/junit5/junit-5-vs-junit-4/) JUnit5 旨在适应 Java8 编码风格,并且比 JUnit4 更加健壮和灵活。在本篇文章 **JUnit5 vs JUnit4** 中,我们将重点介绍 JUnit4 和 JUnit5 之间的一些主要区别。 ## 1\. JUnit5 与 JUnit4 – 注解 两个版本中的大多数注解都相同,但几乎没有区别。 这是一个快速比较。 | 特性 | JUnit4 | JUnit5 | | --- | --- | --- | | 声明测试方法 | `@Test` | `@Test` | | 在当前类中的所有测试方法之前执行 | `@BeforeClass` | `@BeforeAll` | | 在当前类中的所有测试方法之后执行 | `@AfterClass` | `@AfterAll` | | 在每种测试方法之前执行 | `@Before` | `@BeforeEach` | | 在每种测试方法之后执行 | `@After` | `@AfterEach` | | 禁用测试方法/类 | `@Ignore` | `@Disabled` | | 进行动态测试的测试工厂 | 不适用 | `@TestFactory` | | 嵌套测试 | NA | `@Nested` | | 标记和过滤 | `@Category` | `@Tag` | | 注册自定义扩展 | NA | `@ExtendWith` | ## 2\. JUnit5 和 JUnit4 之间的其他区别 #### 2.1 架构 JUnit4 将所有内容捆绑到单个 jar 文件中。 JUnit5 由 3 个子项目组成,即 JUnit Platform,JUnit Jupiter 和 JUnit Vintage。 1. ##### JUnit 平台 它定义了`TestEngine` API,用于开发在平台上运行的新测试框架。 2. ##### JUnit Jupiter 它具有所有新的 junit 注解和`TestEngine`实现,以运行使用这些注解编写的测试。 3. ##### JUnit Vintage 为了支持在 JUnit5 平台上运行 JUnit 3 和 JUnit4 书面测试。 #### 2.2 所需的 JDK 版本 JUnit4 需要 Java 5 或更高版本。 JUnit5 需要 Java8 或更高版本。 #### 2.3 断言 在 JUnit4 中,[`org.junit.Assert`](http://junit.org/junit4/javadoc/4.12/org/junit/Assert.html)具有所有肯定的方法来验证预期结果和结果。 他们接受错误消息的额外参数作为方法签名中的第一个参数。 例如: ```java public static void assertEquals(long expected, long actual) public static void assertEquals(String message, long expected, long actual) ``` 在 JUnit5 中,[`org.junit.jupiter.Assertions`](http://junit.org/junit5/docs/current/api/org/junit/jupiter/api/Assertions.html)包含大多数断言方法,包括其他`assertThrows()`和`assertAll()`方法。 到目前为止,`assertAll()`处于实验状态,用于分组断言。 JUnit5 断言方法还具有重载方法,以在测试失败(例如测试失败)时支持传递要打印的错误消息。 ```java public static void assertEquals(long expected, long actual) public static void assertEquals(long expected, long actual, String message) public static void assertEquals(long expected, long actual, Supplier messageSupplier) ``` #### 2.4 假设 在 JUnit4 中,[`org.junit.Assume`](http://junit.org/junit4/javadoc/4.12/org/junit/Assume.html)包含一些方法,用于陈述有关测试有意义的条件的假设。 它具有以下五种方法: 1. `assumeFalse()` 2. `assumeNoException()` 3. `assumeNotNull()` 4. `assumeThat()` 5. `assumeTrue()` 在 JUnit5 中,[`org.junit.jupiter.api.Assumptions`](http://junit.org/junit5/docs/current/api/org/junit/jupiter/api/Assumptions.html) 包含一些方法,用于陈述有关测试有意义的条件的假设。 它具有以下三种方法: 1. `assumeFalse()` 2. `assumingThat​()` 3. `assumeTrue()` #### 2.5 标记和过滤 在 JUnit4 中,使用`@category`注解。 在 JUnit5 中,使用`@tag`注解。 #### 2.6 测试套件 在 JUnit4 中,`@RunWith`和`@Suite`注解。 例如: ```java import org.junit.runner.RunWith; import org.junit.runners.Suite; @RunWith(Suite.class) @Suite.SuiteClasses({ ExceptionTest.class, TimeoutTest.class }) public class JUnit4Example { } ``` 在 JUnit5 中,`@RunWith`,`@SelectPackages`和`@SelectClasses`例如: ```java import org.junit.platform.runner.JUnitPlatform; import org.junit.platform.suite.api.SelectPackages; import org.junit.runner.RunWith; @RunWith(JUnitPlatform.class) @SelectPackages("com.howtodoinjava.junit5.examples") public class JUnit5Example { } ``` #### 2.7 第三方整合 在 JUnit4 中,不支持对第三方插件和 IDE 的集成。 他们必须依靠[反射](//howtodoinjava.com/java/related-concepts/real-usage-examples-of-reflection-in-java/)。 JUnit5 为此有专门的子项目,即 JUnit Platform。 它定义了`TestEngine` API,用于开发在平台上运行的测试框架。 请在评论部分中对 JUnit5 和 JUnit4 之间的**比较**发表您的看法。 学习愉快!