2.1 注解

JUnit Jupiter提供了以下注解用来配置测试和扩展框架。

除非另作说明,否则所有的核心注解都位于junit-jupiter-api模块的 org.junit.jupiter.api包下。

Annotation Description
@Test 表示该方法是测试方法。不同于JUnit4,这个注解不再有任何属性,因为JUnit Jupiter的测试扩展提供对应功能的独立注解。这种方法是被继承的,除非它被重写。
@ParameterizedTest 表示该方法是参数化的测试。这种方法是被继承的,除非它被重写。
@RepeatedTest 表示该方法是用于一个重复测试的测试模板。这种方法要么继承的,要么被重写。
@TestFactory 表示该方法时用于动态测试的一个测试工厂。这种方法要么继承的,要么被重写。
@TestTemplate 表示该方法是一个测试用例的模板,它可以根据调用内容可以被调用多次。这种方法要么继承的,要么被重写。
@TestMethodOrder 用于配置这个测试类的测试方法的执行顺序;与JUnit4@FixMethdOrder功能相似。这种注解是被继承的。
@TestInstance 用于配置测试类的生命周期。这种注解是可以被继承的。
@DisplayName 为测试类、测试方法提供新的显示名称。这种注解是不可以被继承的。
@DisplayNameGeneration 用于为测试类提供自定义的名称生成器。这种注解是可以被继承的。
@BeforeEach 表示当前注解的方法会在这个测试类中每个的@Test@RepeatedTest@ParameterizedTest@TestFactory执行前被调用。与JUnit4@Before功能相似。这种方法要么被继承,要么被重写。
@AfterEach 表示当前注解的方法会在这个测试类中每个的@Test@RepeatedTest@ParameterizedTest@TestFactory执行后被调用。与JUnit4@After功能相似。这种方法要么被继承,要么被重写。
@BeforeAll 表示当前注解方法将在这个测试类的所有@Test@RepeatedTest@ParameterizedTest@TestFactory之前被调用。与JUnit4@BeforeClass功能相似。该方法要么被继承,要么隐藏或覆盖,而且这种方法必须是static的,除非使用per-class测试生命周期。
@AfterAll 表示当前注解方法将在这个测试类的所有@Test@RepeatedTest@ParameterizedTest@TestFactory之后被调用。与JUnit4@AfterClass功能相似。该方法要么被继承,要么隐藏或覆盖,而且这种方法必须是static的,除非使用per-class测试生命周期。
@Nested 表示当前注解是一个非静态的内部测试类。@BeforeAll@AfterAll方法不能直接在内部测试类使用,除非使用per-class测试生命周期。这种注解是不能被继承的。
@Tag 用于过滤测试而声明的标记,它可以使用类和方法上。用于JUnit4CategoriesTestNG上的test groups功能相似。这种注解能在类上被继承,但不能在方法上继承。
@Disabled 用于隐藏一个测试类或者测试方法。与JUnit4@Ignore功能相似。这种注解不能被继承。
@Timeout 如果在testtest factorytest templatelifecycle生命周期方法执行超过指定时间,就失败。这种注解可以被继承
@ExtendWith 用于以声明方式注册扩展。这种注解可以被继承
@RegisterExtension 通过属性的方式来注册扩展代码。这种属性可以被继承,除非它被隐藏。
@TempDir 在生命周期方法或者测试方法中,通过属性注入或者参数注入的方式来提供一个临时目录。该注解在org.junit.jupiter.api.io包下。

2.1.1 元注解和组合注解

JUnit Jupiter注解可以当前元注解使用。这意味你可以定义自己的组合注解,它将自动继承元注解的功能。

比如,你没必要在自己代码中复制、粘贴@Tag("fast"),你可以自定义一个组合注解@Fast@Fast可以完全代替@Tag("fast")

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

import org.junit.jupiter.api.Tag;

@Target({ ElementType.TYPE, ElementType.METHOD })
@Retention(RetentionPolicy.RUNTIME)
@Tag("fast")
public @interface Fast {
}

接下来测试方法可以使用@Fast注解。

@Fast
@Test
void myFastTest() {
    // ...
}

你甚至可以进一步的自定义组合注解@FastTest,它可以完全的替代@Tag("fast")@Test

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

import org.junit.jupiter.api.Tag;
import org.junit.jupiter.api.Test;

@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
@Tag("fast")
@Test
public @interface FastTest {
}

JUnit会自动地识别出这个方法是测试方法,并且用fast标签标注。

@FastTest
void myFastTest() {
    // ...
}

results matching ""

    No results matching ""