gpt4 book ai didi

java - JUnit BeforeAll 与静态 block - 执行顺序

转载 作者:行者123 更新时间:2023-12-05 02:08:34 30 4
gpt4 key购买 nike

我有一个简单的问题。我有这样的类结构:基类和子类(关系是继承)。 @BeforeAll 来自 JUnit5。

 abstract class Base {
static{
System.out.println("A");
}

@BeforeAll
public static void setUp() {
System.out.println("B");
}
}


class Child extends Base {
static {
System.out.println("C");
}

@Test
public void test() {
System.out.println("D");
}
}

所以,在我看来,执行顺序应该是:ACBD但是,这看起来像:ABCD我正在搜索信息,但找不到任何相关信息。

最佳答案

顺序由 Java 类加载和 JUnit5 的 TestEngine [1](如果我是正确的)确定。所以JUnit的测试执行和Java的类加载是有区别的。

@BeforeAll 与静态 block

记住这两者的区别。

静态 block - 仅在 Java 的类加载器将类加载到内存中时执行一次,例如创建一流的实例。

@BeforeAll - 方法在当前测试类中的所有测试之前由 JUnit 的测试引擎执行。

因此,如果您有另一个扩展 Base 的测试类并运行所有测试,static block 将只执行一次,而 @BeforeAll两次(每个测试类)。

订单说明

  1. 当 JUnit 执行测试时,它会实例化您的 Child,它首先需要调用 Base
  2. “A” - Java 类加载器尚未加载 Base 类,因此它加载该类并 - 调用 static block
  3. "B" - JUnit 的运行程序看到 @BeforeAll 注释并检查它是否已经被调用,如果没有调用该方法。
  4. "C" - 现在 Java 可以完成 Child 的实例化,因此类加载器可以加载它并调用静态 block 。
  5. "D" - Child 已初始化,并执行 @Test 注释的方法。

现在假设还有另一个 class 例如AnotherChild 扩展 Base。我们正在执行两个测试类 ChildAnotherChild,因此 JUnit 必须调用 @BeforeAll 两次,但是 Java 已经在执行第一个测试类时加载了 Base 类,因此它将被调用仅一次

请注意,这是粗略的简化情况,实际上有点复杂(像往常一样)。


[1] https://junit.org/junit5/docs/current/api/org.junit.platform.engine/org/junit/platform/engine/TestEngine.html

关于java - JUnit BeforeAll 与静态 block - 执行顺序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60752081/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com