JUnitランナーによるテストクラスのサンプルを以下に示します。
@RunWith(ThrowableTestRunner.class) // ThrowableTestRunnerをJUnitランナーに指定
public class HogehogeTest {
@Test(expected = SQLException.class) // SQLExceptionがスローされるとテスト成功
@Throw (
targetClass = Connection.class, // 対象となるクラス、インタフェース
methodName = "close", // 例外をスローするメソッド
exceptionClass = SQLException.class, // スローする例外クラス
message = "SQL例外のテストです。" // 例外にセットされるメッセージ(省略可)
)
public void testSomeMethod() throws Exception {
// テスト処理
// targetClassおよびそのサブクラス、インタフェースの場合は
// そのインタフェースを実装するクラスのオブジェクトで、
// methodNameで指定した名称のメソッドが呼び出された場合に
// exceptionClassの例外がスローされる
}
}
o instanceof targetClass がtrueとなるオブジェクトで
methodNameという名称のメソッドの呼出しがあった場合に例外がスローされます。@Before
で注釈されたセットアップメソッドで作成したオブジェクトが使用できないのは不便かもしれませんが、
テストメソッドの先頭でセットアップメソッドを呼ぶようにしてください。
public class HogehogeTest {
@Test(expected = IndexOutOfBoundsException.class) // IndexOutOfBoundsExceptionがスローされるとテスト成功
@Throw (
targetClass = List.class, // 対象となるインタフェース
methodName = "get", // 例外をスローするメソッド
exceptionClass = IndexOutOfBoundsException.class, // スローする例外クラス
message = "インデックス範囲外のテストです。" // 例外にセットされるメッセージ(省略可)
)
public void testSomeMethod() throws Exception {
List xxList = ....
xxList = ThrowableTestProxy.newInstance(xxList);
// テスト処理
}
}
上記の例ではテストメソッドに直接記述してありますが、
Thow注釈はスタックから検索しますので
テストメソッドから同一スレッドで直接的、間接的に呼ばれる場所であれば
別のメソッドでも別のクラスでもプロキシを作成できます。
セットアップメソッドなど、テストメソッド実行前にプロキシを作成する場合はThrow注釈を参照できないため、
ThrowableTestProxy.newInstance(T realObj, java.lang.Class<T> interfaceType)
で第二引数にインタフェースを指定してください。
JUnitランナーとしてThrowableTestRunnerを指定しなければ
コンテキストクラスローダを変更しませんので
セットアップメソッドで初期化された変数の参照も可能です。