ClassRule,TestRuleの変更がありました。
TestWatchmanがdeprecatedになってTestWatcherに置き換わるなど。
Ruleのパッケージについて、あまり知らなかったので、調べて、まとめてみました。
TestName
現在のテストメソッドの情報等を取得する。public class SampleClassTest { @Rule public TestName name = new TestName(); @Test public void test() { System.out.println(name.getMethodName()); fail("Not yet implemented"); } }
ErrorCollector
読んで字の通り、例外を集めて保持するクラスです。例外をaddして、最後のverifyでaddされたエラーの個数などでチェックをかけます。public class TestExternalResource { @Rule public ErrorCollector collector = new ErrorCollector() { protected void verify() throws Throwable { System.out.println("[ErrorCollector]"); super.verify(); }; }; @Test public void test() { collector.addError(new Throwable("first thing went wrong")); collector.addError(new Throwable("second thing went wrong")); int sample = 1; collector.checkThat(0, is(sample)); } }
ExpectedException
例外を制御する構文です。@Test(expected=NullPointerException.class)と同じような意味ですが、もうちょっと拡張性を高くしたい場合に使えます。
public class TestExpectedException { @Rule public ExpectedException thrown = ExpectedException.none(); @Test public void throwsNothing() { // no exception expected, none thrown: passes. } @Test public void throwsNullPointerException() { thrown.expect(NullPointerException.class); throw new NullPointerException(); } @Test public void throwsNullPointerExceptionWithMessage() { Matcher[] allowedExceptionMatchers = { is(NullPointerException.class), is(IllegalArgumentException.class) }; thrown.expect(anyOf(allowedExceptionMatchers)); thrown.expectMessage("happened?"); throw new NullPointerException("What happened?"); } }
TemporaryFolder
/tmp以下にファイルやディレクトリをおく場合に使えるクラスです。public class TestTemporaryFolder { @Rule public TemporaryFolder folder = new TemporaryFolder(); @Test public void test() throws IOException { File createFile = folder.newFile("myFile.txt"); File createFolder = folder.newFolder("subFolder"); System.out.println("Path:" + createFile.getAbsolutePath()); System.out.println("Path:" + createFolder.getAbsolutePath()); } }
Timeout
メソッドのタイムアウト監視クラスです。メソッドの実行時間のチェック等に使います。public class TestTimeout { @Rule public MethodRule globalTimeout = new Timeout(1000); @Test public void test() { for (;;) ; } }
Verifier
テストが成功した後に、チェックする仕組みを入れたい場合このクラスを利用します。public class TestVerifier { private ErrorLog error = new ErrorLog(); @Rule public MethodRule verifier = new Verifier() { @Override public void verify() { System.out.println("[Verifier]"); assertTrue(error.isEmpty()); } }; @Test public void test() { fail("Not yet implemented"); } @Test public void test2() { error.add("sample"); } }
TestWatchman(TestWatcher)
テストケースの結果をテスト実施後すぐに確認したい場合に使えます。public class TestTestWachman { private static String watchedLog; @Rule public MethodRule watchman = new TestWatchman() { @Override public void failed(Throwable e, FrameworkMethod method) { System.out.println("[watch]fail"); watchedLog += method.getName() + " " + e.getClass().getSimpleName() + "\n"; } @Override public void succeeded(FrameworkMethod method) { System.out.println("[watch]success"); watchedLog += method.getName() + " " + "success!\n"; } }; @Test public void test() { fail("Not yet implemented"); } @Test public void test2() { } }
ExternalResource
外部リソースなどのアクセスをテスト前後で行いたい場合に利用します。だいたいDBにアクセスしたり、ファイルアクセスだったりすると思います。クラスをインスタンス化したら、そのクラスのテスト前後にExternalResourceのbefore,afterが実行されます。public class SampleClassTest { @Rule public ExternalResource resource = new ExternalResource() { Server myServer = new Server(); @Override protected void after() { // 外部リソースの接続解除 System.out.println("[ExternalResrouce after]"); myServer.disconnect(); } @Override protected void before() throws Throwable { // 外部リソース接続 System.out.println("[ExternalResrouce before]"); myServer.connect(); } }; @Test public void test() { } }
テストメソッドの実行前後に起動されるメソッドの順序を調べてみました。
ExternalResource Before
Before
After
【テストメソッド実行】
ErrorCollector
Verifier
TestWatchman
ExternalResource After
同じ機能っぽいじゃないか?と思うクラスがあるとは思いますが、ユースケース別に
使い分けると非常によいクラスになると思うので、うまく使い分けていきましょう。
次はhamcrestあたりかな。
こんにちは。
返信削除機能が意外に充実していますね。