JUnit5 学习笔记②-官方手册翻译+理解
2.2. 测试类和方法
测试类: 任何顶层类,静态成员类,或者至少包含一个测试类的@Nested class.
测试类必须不是抽象,以及有一个简单构造函数.
测试方法: 任何被与@Test,@RepeatedTest,@ParameterizedTest,@TestFactory, 或@TestTemplate直接声明实例方法.
生命周期方法: 任何被与@BeforeAll, @AfterAll, @BeforeEach, 或 @AfterEach直接声明方法.
测试方法和生命周期方法可以被局部声明在当前的测试类,继承超类,接口. 此外测试方法和生命周期方法必须不是抽象,也不能返回一个值.
! 测试类,方法和生命周期方法不要求public,但他们一定不是private
如下测试类证实方法的使用和所有支持的生命周期方法
A standard test class
import static org.junit.jupiter.api.Assertions.fail;
import static org.junit.jupiter.api.Assumptions.assumeTrue;
import org.junit.jupiter.api.AfterAll;
import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.BeforeAll;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Disabled;
import org.junit.jupiter.api.Test;
class StandardTests {
@BeforeAll
static void initAll() {
}
@BeforeEach
void init() {
}
@Test
void succeedingTest() {
}
@Test
void failingTest() {
fail("a failing test");
}
@Test
@Disabled("for demonstration purposes")
void skippedTest() {
// not executed
}
@Test
void abortedTest() {
assumeTrue("abc".contains("Z"));
fail("test should have been aborted");
}
@AfterEach
void tearDown() {
}
@AfterAll
static void tearDownAll() {
}
}
2.3.展示名称
测试类和测试方法能通过@DisplayName表明常用名称,可以空格,特殊字母,甚至是emoji. 它们将被测试启动器和IDEs展示在测试报告中.
import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Test;
@DisplayName("A special test case")
class DisplayNameDemo {
@Test
@DisplayName("Custom test name containing spaces")
void testWithDisplayNameContainingSpaces() {
}
@Test
@DisplayName("╯°□°)╯")
void testWithDisplayNameContainingSpecialCharacters() {
}
@Test
@DisplayName("🐎")//Win10,IDEA中需要使用微软输入法才可以展示emoji
void testWithDisplayNameContainingEmoji() {
}
}
2.3.1 展示名字生成器
JUnit Jupiter 支持常用的能通过@DisplayNameGeneration注解展示名字生成器配置。通过@DisplayName注解提供的值总是优先于DisplayNameGenerator
通过执行DisplayNameGenerator生成器能被创造,下列是Jupiter中的一些默认可选的DisplayNameGenerator
| DisplayNameGenerator | Behavior |
| Standard | 匹配标准展示名字生成器在通常的位置 |
| Simple | 为方法移除拖拉的括号为无参 |
| ReplaceUnderscores | 把空格换成下划线 |
| IndicativeSentences | 通过链接测试的名字和随附的类生成完整的句子 |
略
2.3.2. 设置默认展示名字生成器
你能使用junit.jupiter.displayname.generator.default configuration parameter 去具体说明DisplayNameGenerator的你想默认使用的完全限定类名.如同通过@DisplayNameGeneration注解配置的展示名字生成器, 这个被支持的类必须执行DisplayNameGenerator的接口.默认展示名字生成器会被所有测试使用除非@DisplayNameGeneration注解出现在一个随附的测试类或测试接口. 通过@DisplayName注解提供的值总是优先于DisplayNameGenerator.
例如,为了使用ReplaceUnderscores默认展示名字生成器,你应该设置配置参数给相一致的完全限定类名.
与之类似,你能具体说明执行DisplayNameGenerator的任何常用类完全限定类名.
总而言之,测试类或方法的展示名称取决于下列优先规则:
- @DisplayName的注解的值,如果存在;
- 通过呼叫具体说明在@DisplayNameGeneration注解的DisplayNameGenerator,如果存在;
- 通过呼叫默认被配置参数配置的DisplayNameGenerator,如果存在;
- 通过呼叫 org.junit.jupiter.api.DisplayNameGenerator.Standard
2.4. 断言
JUnit Jupiter来自于部分JUnit 4的断言方法和添加了一些能用在Java 8闭包.
所有JUnit Jupiter断言是静态方法在org.junit.jupiter.api.Assertions类.
手册示例略.(无法执行,需要Person,Calculator类)
! assertTimeoutPreemptively() 抢占式暂停
与声明式暂停相反,Assertions中不同的assertTimeoutPreemptively()方法执行提供的executable和supplier类在一个不同的线程中(和调用代码).如果执行依赖于java.lang.ThreadLocal的executable和supplier类中,这个行为会导致不良侧反应
一个常见的例子是Spring框架中的相互作用的测试支持.特别的,Spring的测试支持结合事务状况和当前的线程在测试方法被调用前. 因此,如果提供给assertTimeoutPreemptively()的executable和supplier类调用参与到事务Spring-managed部件时,那些组件采取的动作不会随着test-managed事务回滚.相反地,这些行动会被投入到持久性存储器即使test-managed事务回滚
类似的副作用会在依赖于ThreadLocal存储器的其他框架中出现
2.4.1略
2.4.2略
浙公网安备 33010602011771号