Java 如何在模块中执行所有junit5测试之前和之后编写一次代码?

Java 如何在模块中执行所有junit5测试之前和之后编写一次代码?,java,junit5,Java,Junit5,我有一个多模块项目spring boot项目,其中每个模块生成一个jar。每个模块都有一个带有JUnit5测试的src/main/test。是否有一种方法可以在执行特定模块中的src/main/test中的所有测试之前和之后运行代码?例如,如果我有两个模块A和B,我想要 在执行模块A中的所有测试之前运行代码 运行代码所有测试模块A执行 在执行模块B中的所有测试之前运行代码 执行模块B中的所有测试后运行代码 您可以定义测试类中方法的顺序,但不能定义测试类的顺序 public class Modu

我有一个多模块项目spring boot项目,其中每个模块生成一个jar。每个模块都有一个带有JUnit5测试的
src/main/test
。是否有一种方法可以在执行特定模块中的
src/main/test
中的所有测试之前和之后运行代码?例如,如果我有两个模块A和B,我想要

  • 在执行模块A中的所有测试之前运行代码
  • 运行代码所有测试模块A执行
  • 在执行模块B中的所有测试之前运行代码
  • 执行模块B中的所有测试后运行代码

您可以定义测试类中方法的顺序,但不能定义测试类的顺序

public class ModuleBaseClass {

  private static boolean started = false;

  @BeforeAll
  public static void beforeAllMethod() {
      if (!started) {
          System.out.println("@BeforeAll static method invoked once.");
          started = true;
      }
      System.out.println("@BeforeAll static method invoked for every class.");
  }
}

public class ModuleFeature1Class extends ModuleBaseClass {

  @Test
  public void testMethod() {
      System.out.println("ModuleFeature1Class: in testMethod().");
  }
}

public class ModuleFeature2Class extends ModuleBaseClass {

  @Test
  public void testMethod() {
      System.out.println("ModuleFeature2Class: in testMethod().");
  }
}

这个特性有一个开放的请求,但是还没有消息说JUnit是否会实现它:

您可以使用继承和注释,还可以选择使用一个标志,对所有继承的测试类只执行一次

public class ModuleBaseClass {

  private static boolean started = false;

  @BeforeAll
  public static void beforeAllMethod() {
      if (!started) {
          System.out.println("@BeforeAll static method invoked once.");
          started = true;
      }
      System.out.println("@BeforeAll static method invoked for every class.");
  }
}

public class ModuleFeature1Class extends ModuleBaseClass {

  @Test
  public void testMethod() {
      System.out.println("ModuleFeature1Class: in testMethod().");
  }
}

public class ModuleFeature2Class extends ModuleBaseClass {

  @Test
  public void testMethod() {
      System.out.println("ModuleFeature2Class: in testMethod().");
  }
}
这将打印:

@BeforeAll static method invoked once.
@BeforeAll static method invoked for every class.
ModuleFeature1Class: in testMethod().
@BeforeAll static method invoked for every class.
ModuleFeature2Class: in testMethod().

同样,您可以使用注释在测试后执行。

如果所有测试都在一个类中,则@BeforeClass注释会执行此任务。我想错了吗?@sfarbac JUnit5将注释
@BeforeClass
重命名为
@BeforeAll
我不是在谈论测试方法的顺序。我说的是在src/main/test运行中的所有测试之前,以及在所有测试都完成运行之后。例如,在一个模块中运行所有测试后关闭数据库。我建议查看junit jupiter listener@BeforeAll在类中的测试方法上的工作,它在包含测试方法的类集合中不起作用。