JUnit では面倒な例外発生のテストが簡単に書けるという事で、TestNG を使ってみました。(JUnit は 3 しか使った事ない気がするので、最新版だと簡単に書けるのかな?)
TestNG は TestNG - Download Current Release and Beta Versions から 5.10 をダウンロードしました。
早速コードの紹介。
Target.java
import java.lang.*; public class Target { public static void throwIllegalArgumentException() { throw new IllegalArgumentException(); } public static void nonThrowException() { } }TargetTest.java
import static org.testng.Assert.assertEquals; import org.testng.annotations.BeforeMethod; import org.testng.annotations.Test; public class TargetTest { @Test(expectedExceptions = { java.lang.Exception.class }) public void 例外はExceptionですか() { Target.throwIllegalArgumentException(); // IllegalArgumentException が投げられるのに、成功する } @Test(expectedExceptions = { java.lang.Exception.class }) public void 例外が投げられますか() { Target.nonThrowException(); // 例外が投げられないので失敗する } }
@Test アノテーション で expectedExceptions っていうので、例外の型を指定すると例外が発生しなかったらテスト失敗になります。
ただ気になったのが、expectedExceptions で指定する例外の型から派生した例外が発生しても、テストがOKになってしまいました。何か指定の仕方があるのかな?(ちゃんとドキュメントを読んでないのでわかりませんが。。)
ちなみに、NUnit では指定した例外の型で無いとテスト失敗になります。(NUnit は 2.5.2 を使っています)
using System; using NUnit.Framework; class Program { public static void ThrowArgumentNullExceptionMethod() { throw new ArgumentNullException(); } public static void NonThrowArgumentExceptionMethod() { } } [TestFixture] class Test { [Test] [ExpectedException(ExpectedException = typeof(Exception))] public void 例外はExceptionですか() { Program.ThrowArgumentNullExceptionMethod(); // ArgumentNullException が投げられるので失敗する } [Test] [ExpectedException(ExpectedException = typeof(Exception))] public void 例外が投げられますか() { Program.NonThrowArgumentExceptionMethod(); // 例外が投げられないので失敗する } }