目录
- 目录
- 嵌套测试
- 实例
- 说明
- 系列导航
嵌套测试
嵌套测试使测试编写者有更多的能力来表达几组测试之间的关系。这是一个精心设计的例子。
实例
- TestingAStackDemo.java
堆栈测试例子
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertFalse;
import static org.junit.jupiter.api.Assertions.assertThrows;
import static org.junit.jupiter.api.Assertions.assertTrue;import java.util.EmptyStackException;
import java.util.Stack;import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Nested;
import org.junit.jupiter.api.Test;@DisplayName("A stack")
class TestingAStackDemo {Stack<Object> stack;@Test@DisplayName("is instantiated with new Stack()")void isInstantiatedWithNew() {new Stack<>();}@Nested@DisplayName("when new")class WhenNew {@BeforeEachvoid createNewStack() {stack = new Stack<>();}@Test@DisplayName("is empty")void isEmpty() {assertTrue(stack.isEmpty());}@Test@DisplayName("throws EmptyStackException when popped")void throwsExceptionWhenPopped() {assertThrows(EmptyStackException.class, () -> stack.pop());}@Test@DisplayName("throws EmptyStackException when peeked")void throwsExceptionWhenPeeked() {assertThrows(EmptyStackException.class, () -> stack.peek());}@Nested@DisplayName("after pushing an element")class AfterPushing {String anElement = "an element";@BeforeEachvoid pushAnElement() {stack.push(anElement);}@Test@DisplayName("it is no longer empty")void isNotEmpty() {assertFalse(stack.isEmpty());}@Test@DisplayName("returns the element when popped and is empty")void returnElementWhenPopped() {assertEquals(anElement, stack.pop());assertTrue(stack.isEmpty());}@Test@DisplayName("returns the element when peeked but remains not empty")void returnElementWhenPeeked() {assertEquals(anElement, stack.peek());assertFalse(stack.isEmpty());}}}
}
说明
只有非静态嵌套类(即内部类)可以充当@嵌套测试类。
嵌套可以是任意深的,并且这些内部类被认为是测试类家族的完整成员,只有一个例外:@BeforeAll和@AfterAll方法默认不工作。
原因是Java不允许内部类中的静态成员。
但是,可以通过使用 @TestInstance(Lifecycle.PER_CLASS)
注释 @Nested 测试类(参见测试实例生命周期)来绕过这个限制。
系列导航
系列导航