LoginSignup
0
0

More than 5 years have passed since last update.

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

Posted at

タイトルが全て.

最近の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の順で実行されるようだ.

0
0
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0