Junit @Before/@After叫什么顺序?

2022-08-31 07:51:33

我有一个集成测试套件。我有一个类供我所有的测试扩展。此基类具有用于建立 API 和数据库连接的 () 和 () 方法。我一直在做的就是在每个测试用例中重写这两个方法,并调用 和 。但是,如果有人忘记呼叫超级或将他们放在错误的位置并引发异常并且他们忘记在最终或什么地方调用超级,这可能会导致问题。IntegrationTestBase@Beforepublic void setUp()@Afterpublic void tearDown()super.setUp()super.tearDown()

我想做的是在基类上制作和方法,然后添加我们自己的注释和方法。做一些初始测试,它似乎总是按以下顺序调用:setUptearDownfinal@Before@After

Base @Before
Test @Before
Test
Test @After
Base @After

但我只是有点担心订单不能保证,并且可能会导致问题。我环顾四周,没有看到任何关于这个主题的东西。有谁知道我是否可以做到这一点并且没有任何问题?

法典:

public class IntegrationTestBase {

    @Before
    public final void setUp() { *always called 1st?* }

    @After
    public final void tearDown() { *always called last?* }
}


public class MyTest extends IntegrationTestBase {

    @Before
    public final void before() { *always called 2nd?* }

    @Test
    public void test() { *always called 3rd?* }

    @After
    public final void after() { *always called 4th?* }
}

答案 1

是的,这种行为是有保证的:

@Before

超类的方法将在当前类的方法之前运行,除非它们在当前类中被重写。未定义其他排序。@Before

@After

在超类中声明的方法将在当前类的方法之后运行,除非它们在当前类中被重写。@After


答案 2

一个潜在的陷阱,以前咬过我:

我喜欢在每个测试类中最多有一个方法,因为不能保证运行类中定义的方法的顺序。通常,我将调用这样的方法 。@Before@BeforesetUpTest()

但是,尽管记录为 ,但这仅适用于每个标有 with 的方法在类层次结构中具有唯一名称的情况。@BeforeThe @Before methods of superclasses will be run before those of the current class. No other ordering is defined.@Before

例如,我有以下内容:

public class AbstractFooTest {
  @Before
  public void setUpTest() { 
     ... 
  }
}

public void FooTest extends AbstractFooTest {
  @Before
  public void setUpTest() { 
    ...
  }
}

我本来以为之前会跑,但只被处决了。 根本没有被叫到。AbstractFooTest.setUpTest()FooTest.setUpTest()FooTest.setupTest()AbstractFooTest.setUpTest()

必须按如下方式修改代码才能正常工作:

public void FooTest extends AbstractFooTest {
  @Before
  public void setUpTest() {
    super.setUpTest();
    ...
  }
}

推荐