1. ホーム
  2. java

[解決済み] Junitの@Before/@Afterはどのような順番で呼び出されるのですか?

2022-05-15 21:01:53

質問

統合テスト・スイートがあります。私は IntegrationTestBase クラスがあり、すべてのテストがこれを継承しています。この基本クラスには @Before ( public void setUp() ) と @After ( public void tearDown() ) メソッドでAPIとDBの接続を確立しています。私がやっていることは、それぞれのテストケースでこの2つのメソッドをオーバーライドして super.setUp()super.tearDown() . しかし、これは誰かがsuperを呼び忘れたり、間違った場所に置いたりして例外が発生し、finallyでsuperを呼び忘れたりすると問題になることがあります。

私がやりたいのは setUptearDown メソッドをベースクラス final を追加し、さらに独自のアノテーションを施した @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?* }
}

どのように解決するのですか?

はい、この動作は保証されています。

@Before :

@Before のメソッドは、現在のクラスでオーバーライドされていない限り、 現在のクラスのメソッドより先に実行されます。それ以外の順序は定義されていません。

@After :

@After スーパークラスで宣言されたメソッドは、現在のクラスでオーバーライドされない限り、現在のクラスのメソッドの後に実行されます。