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 | 用于过滤测试而声明的标记,它可以使用类和方法上。用于JUnit4的Categories和TestNG上的test groups功能相似。这种注解能在类上被继承,但不能在方法上继承。 |
| @Disabled | 用于隐藏一个测试类或者测试方法。与JUnit4的@Ignore功能相似。这种注解不能被继承。 |
| @Timeout | 如果在test、test factory、test template、lifecycle生命周期方法执行超过指定时间,就失败。这种注解可以被继承 |
| @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() {
// ...
}