public class XXXTest extends TestCase{ // コンストラクタ public XXXTest(String arg0){ super(arg0); } // テストメソッド // testで始まるメソッド public void testAAAA(){ //テストの内容 // テスト対象のメソッドを実行して // assertXXXX()メソッドで結果を検証 } // 各テストメソッドの初期化処理 public void setUp(){ } // 各テストメソッドの終了処理 public static void tearDown(){ } // このテストクラスの初期化処理 public static void oneTimeSetUp(){ } // このテストクラスの終了処理 public void oneTimeTearDown(){ } // JUnitは、suite()の返り値のTestを実行する // ontTimeSetup() / oneTimeTearDown() を実装する為に // suite()をオーバーライドして、XXXTest.class->TestSuit->TestSetup // でwrapしたものを返す。 public static Test suite() throws Exception { TestSuite suite = new TestSuite(XXXTest.class); TestSetup wrapper = new TestSetup(suite) { public void setUp() throws Exception { oneTimeSetUp(); } public void tearDown() throws Excepiton { oneTimeTearDown(); } }; return wrapper; } }
public static Test suite() throws Exception { TestSuite suite = new TestSuite("XXXクラスのテスト"); suite.addTest( new TestSuite(new XXXTest("testFirst") ) ); suite.addTest( new TestSuite(new XXXTest("testSecond") ) ); suite.addTest( new TestSuite(new XXXTest("testThird") ) ); suite.addTest( new TestSuite(new XXXTest("testEnd") ) ); TestSetup wrapper = new TestSetup(suite) { public void setUp() throws Exception { oneTimeSetup(); } public void tearDown() throws Excepiton { ontTimeTearDown(); } }; return wrapper; }このとき、各テストメソッド間で持ち回る値を格納したXXXTestクラスのフィールドはstaticにしなければならない事に注意。
assertEqualsは内容が同じかどうかをテストするメソッド
DTO*1のAssertEquals?をする時には、toString() メソッドで文字列にできるようにしておくと良い
JUnit: assertEquals( expectedDTO.toString(), actualDTO.toString() ) DTO: public class DTO implements Serializable{ private String foo; private float bar; public String toString(){ StringBuffer sbuf = new StringBuffer(); sbuf.append( "foo=" + foo + ","); sbuf.append( "bar=" + bar ); return sbuf.toString(); } }
key値を辞書順に並べてString型に変換する。以下のメソッドをTestクラスの上位クラスにするなり、ユーティリティクラスをを作成して実装する。
Mapを拡張したDTOをつくるのは・・・やめた方が良い(ツブシが効かないシステムになる)。
public String mapToString( map ){ ArrayList keys = new ArrayList( map.keySet() ); Collections.sort( keys ); StringBuffer sbuf = new StringBuffer(); for( Iterator it = keys.iterator() ; it.hasNext() ; ){ Object key = it.next(); sbuf.append( key ); sbuf.append( "=" ); Object val = map.get( key ); if( val instanceof Map ){ sbuf.append( "{" + mapToString((Map)val) + "}" ); }else sbuf.append( val ); } sbuf.append( "," ); } return sbuf.substring( 0 , sbuf.length()-1 ); // 最後の","を除く }
assertSame/NotSame?は参照が同じか/違うかどうかをテストするメソッド
assertTrue/Falseは、結果がtrueか/falseかをテストするメソッド
assertNull/NotNull?は、結果がNullか/Nullでないかをテストするメソッド
failは、無条件にテストを失敗させるメソッド
void test(){ try{ Subject sbj = new Subject(); sbj.setParameter( invalidParameter ); sbj.doSomething() // ここで例外発生を期待 fail("SomeExceptionが発生しませんでした"); // 例外が発生していない }catch( SomeException ex ){ ex=null; // SomeExceptionが発生したらテスト合格 } ...(次の検証)... }
import junit.extensions.TestSetup; import junit.framework.Test; import junit.framework.TestCase; import junit.framework.TestSuite; /** * XXXXのテスト. * <pre> * 1)します * 2)します * 3)します * 4)します * </pre> * @author * @version $Id$ */ public class XXXXTest extends TestCase { /** テスト名 */ private static final String TEST_NAME = XXXXTest.class.getName(); /** メソッド名を起動する順に列挙 */ private static final String[] METHODS = {"test1", "test2", "test3"}; /** * コンストラクタ. * * @param arg0 メソッド名 */ public XXXXTest(final String arg0) { super(arg0); } /** テスト1. かならず最初に実行される */ public void test1(){ } /** テスト2. かならず、テスト1の後に実行される */ public void test2(){ } /** テスト3. かならず、テスト1,2の後に実行される */ public void test3(){ } /** * このテストクラスの初期化処理 */ public static void oneTimeSetUp() { } /** * このテストクラスの終了処理 */ public static void oneTimeTearDown() { } /** * JUnitは、suite()の返り値のTestを実行する * ontTimeSetup() / oneTimeTearDown() を実装する為に * suite()をオーバーライドして、XXXTest.class->TestSuit->TestSetup * でwrapしたものを返す。 * * @return TestSuite * @throws Exception 例外 */ public static Test suite() throws Exception { TestSuite suite = new TestSuite(TEST_NAME); for (int cnt = 0; cnt < METHODS.length; cnt++) { suite.addTest(new XXXXTest(METHODS[cnt])); } TestSetup wrapper = new TestSetup(suite) { public void setUp() throws Exception { oneTimeSetUp(); } public void tearDown() throws Exception { oneTimeTearDown(); } }; return wrapper; } /** * 各テストメソッドの開始処理 */ public void setUp() { } /** * 各テストメソッドの終了処理 */ public void tearDown() { } }