タイトルが全て.
最近の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の順で実行されるようだ.