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() {
// ...
}