首页 > 解决方案 > JUnit5:使多个测试对同一个对象进行操作

问题描述

我想将我的 JUnit5 测试设置为对同一个对象进行操作。我读取大文件以用作测试数据,因此我更愿意读取一次并在其余测试中使用相同的数据。

我创建了以下作为一个简单示例,我尝试使用静态对象(“列表”)来实现这一点(不起作用):

import java.util.List;
import java.util.ArrayList;
import static org.junit.jupiter.api.Assertions.*;
import org.junit.jupiter.api.BeforeAll;
import org.junit.jupiter.api.Test;

class ExampleTest {

  // Single list object to be modified and accessed by the tests
  private static List<String> list = new ArrayList<String>();

  @BeforeAll
  static void setUpBeforeClass() throws Exception {
    // None
  }

  @Test
  final void addFoo() {
    list.add("foo");
  }

  @Test
  final void addBar() {
    list.add("bar");
  }

  @Test
  final void printList() {
    System.out.println(list.toString());
    assert(list.toString().equals("[foo, bar]"));
  }
}

这样做的结果是 printList() 失败,其中列表为空而不是包含 [foo, bar]。

我已经能够通过将添加数据的方法移动到@BeforeAll 中来完成这项工作:

  private static List<String> list;

  @BeforeAll
  static void setUpBeforeClass() throws Exception {
    list = new ArrayList<String>();
    list.add("foo");
    list.add("bar");
  }

但是最好将数据导入方法作为与@BeforeAll 分开的测试。

@TestInstance(TestInstance.Lifecycle.PER_CLASS) 也不起作用。

标签: javajunitjunit5

解决方案


使用@FixMethodOrder 注释。例如参考这篇文章:https ://www.mkyong.com/unittest/junit-run-test-in-a-particular-order/


推荐阅读