Help us understand the problem. What is going on with this article?

@AfterメソッドはTestWatcher#failedよりも先に実行される

More than 5 years have passed since last update.

タイトルが全て.

最近のJUnitにはTestWatcherというクラスがあって,テストの実行結果を,テストケースから観測することが出来る.例えば上記リンク先では,テストが失敗した時にログを取るみたいな例が紹介されている.

これを使って,テストの結果に応じて@Afterのついたメソッドで行なっている後処理を制御できるのだろうか,と思って試してみた.JUnit4.11を利用した.

import org.junit.After;
import org.junit.Rule;
import org.junit.Test;
import org.junit.rules.TestWatcher;
import org.junit.runner.Description;

import static org.junit.Assert.fail;

/**
 * @Test, @AfterとTestWatcher#failedの実行され順を確認する
 */
public class TestWatchMan {
    private boolean lastTestFailed = false;

    @Rule
    public TestWatcher watchman = new TestWatcher() {

        @Override
        protected void failed(Throwable e, Description description) {
            System.err.println("テスト失敗が観測される");
            lastTestFailed = true;
        }
    };

    @Test
    public void alwaysFailingTest() {
        fail();
    }

    @After
    public void doSomethingWhenTestFails() {
        if (lastTestFailed) {
            System.out.println("なんか後処理");
        } else {
            System.err.println("テスト失敗のフラグがセットされるまえに@After付きメソッドが実装される");
        }
    }
}
java.lang.AssertionError
    at org.junit.Assert.fail(Assert.java:86)
    at org.junit.Assert.fail(Assert.java:95)
    at TestWatchMan.alwaysFailingTest(TestWatchMan.java:27)

テスト失敗のフラグがセットされるまえに@After付きメソッドが実装される
テスト失敗が観測される

ということで,@Test付きのメソッド,@After付きのメソッド,TestWatcher#failedの順で実行されるようだ.

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away