# 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 之间的**比较**发表您的看法。

学习愉快！