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() {
}
}