Logo
Section 1 / 4

@Nested 测试

学习如何使用 @Nested 注解来配置测试层级。

导入

@Nested 测试

学习如何使用 @Nested 注解来配置测试层级。

测试方法被组织在测试类中。测试类中的测试方法通常针对同一个测试目标。JUnit 5 支持嵌套测试,可以轻松表达复杂的测试关系。嵌套测试通过在当前测试类的非静态内部类上使用 org.junit.jupiter.api.Nested 注解来声明。

User 类

让我们通过一个具体示例来学习如何编写嵌套测试。我们将要测试的类是一个负责管理用户的业务服务类。下面的代码展示了 User 类,该类包含两个属性:name 和 email。

1public class User { 2 private final String name; 3 private final String email; 4 5 public User(final String name, final String email) { 6 this.name = name; 7 this.email = email; 8 } 9 10 public String getName() { 11 return this.name; 12 } 13 14 public String getEmail() { 15 return this.email; 16 } 17}

User 类的方法

下面代码中的 UserService 类实现了对 User 对象的增删改查(CRUD)操作。

1public class UserService { 2 Hashtable<String, String> data = new Hashtable<String, String>(); 3 4 public Hashtable<String, String> list() { 5 return data; 6 } 7 8 public void createOrUpdate(User user) { 9 data.put(user.getName(), user.getEmail()); 10 } 11 12 public void delete(String name) { 13 data.remove(name); 14 } 15 16 public boolean isEmpty() { 17 return this.data.isEmpty(); 18 } 19}

测试 UserService 方法

现在我们为 UserService 类添加测试类。在嵌套类 WhenNew 中,我们断言一个新创建的 UserService 对象中没有用户。在嵌套类 AfterAdding 中,我们添加一个新用户,并验证 list 和 isEmpty 方法的行为。在嵌套类 ThenRemove 中,我们移除之前添加的用户,并验证结果。

1import org.junit.jupiter.api.Nested; 2 3@DisplayName("UserService") 4public class UserServiceTest { 5 UserService userService = new UserService(); 6 7 @Nested 8 @DisplayName("当新建时") 9 class WhenNew { 10 @BeforeEach 11 public void createNewUserService() { 12 userService = new UserService(); 13 } 14 15 @Test 16 @DisplayName("没有用户") 17 public void hasNoUsers() { 18 assertTrue(userService.isEmpty()); 19 } 20 } 21 22 @Nested 23 @DisplayName("添加新用户后") 24 class AfterAdding { 25 User user = new User("Alex", "alex@example.org"); 26 27 @BeforeEach 28 public void addNewUser() { 29 userService.createOrUpdate(user); 30 } 31 32 @Test 33 @DisplayName("不再为空") 34 public void isNotEmpty() { 35 assertFalse(userService.isEmpty()); 36 } 37 38 @Test 39 @DisplayName("包含一个用户") 40 public void hasOneUser() { 41 assertEquals(1, userService.list().size()); 42 } 43 44 @Nested 45 @DisplayName("然后移除该用户") 46 class ThenRemove { 47 @BeforeEach 48 public void removeUser() { 49 userService.delete(user.getName()); 50 } 51 52 @Test 53 @DisplayName("应该为空") 54 public void isEmpty() { 55 assertTrue(userService.isEmpty()); 56 } 57 } 58 } 59}

注解、标记和筛选

嵌套测试测验