プロパティを保持するクラスをひとつ用意して static で参照できるようにして おくとアプリケーションのパラメータが一括管理できて便利です。 そんな InitParam クラスを作成します。このクラスは使いまわしのきく Util クラスのようなもので業務フローには関係ないためクラス図にはでてきません。
まず仕様を列挙します、それにあわせてテストを作成します。
これらのテストを作成するためにはプロパティファイル名とプロパティ名を 決定する必要があるでしょう。ここではぱっと思い浮かぶものだけを定義して おきます。また、デフォルトも決定しておきます。
種類 | プロパティ名 | デフォルト |
プロパティファイル名 | lab.properties | なし |
DataSource 名 | lab.DataSourceName | java:comp/env/jdbc/MSSQLDS |
プロパティ名
同じような名前があると衝突がおこります。プレフィックスをつけた プロパティ名を定義するようにしましょう。今回は lab というプレフィックス をつけています
org.flnet.tantau.testlab.TestInitParam というクラスを作成するわけですが 今回は Struts 固有のクラスというわけではないので CactusStrutsTestCase を継承するのではなく JUnit の TestCase クラスを継承して作成します。
org.flnet.tantau.testlab で 新規->クラス->その他 を選択し、 Java -> JUnit -> TestCase を選択します。
それぞれの仕様に対してテストメソットを作成します。 仕様は列挙した順番にテストしなければならないというものではありません。 たとえばテストするためには読み出さなければならないので まずはプロパティファイルがなかったら Exception が返ることをチェックします。
テストメソットではプロパティファイルを作成し、プロパティを読み込み 結果をチェックするといった流れにして作成します。ということは以下のように 作成するとテストが書けません。
public class InitParam { static { // プロパティの読み込み } }
このため以下のように作成することにします。
public class InitParam { private static final String PROPERTYFILE = "lab.properties"; static { try { setProperties(PROPERTYFILE); } catch (Exception e) { // 例外処理 } } public static void setProperties(String propertyFile) throws Exception { // プロパティの読み込み } }
クラスを作成して以後はテストの実行と実装を交互に進めていきます。
setUp() と tearDown() で既存のプロパティファイルを削除します。
/* * @see TestCase#setUp() */ protected void setUp() throws Exception { super.setUp(); removePropertyFile(); } /* * @see TestCase#tearDown() */ protected void tearDown() throws Exception { super.tearDown(); removePropertyFile(); } /* * プロパティファイルの削除 */ private void removePropertyFile() { try { File propertyFile = new File(DIRPATH, FILENAME); // 存在していなくても例外は投げられない propertyFile.delete(); } catch (Exception e) { e.printStackTrace(); fail(); } }
テストメソットであまり複雑なことをやらせるとテストメソット のテストが必要になってしまいます。やりすぎないようにしましょう。
/** * プロパティファイルが存在しなかったら Exception を返すこと */ public void testException() { try { InitParam.setProperties(FILENAME); fail(); } catch (Exception e) { } }
まず、この状態でメソットだけを定義して(そうしないとコンパイルすら通りません) から実行します。すると fail します。そして実装に入ります。
public static void setProperties(String propertyFile) throws Exception { // プロパティの読み込み throw new Exception(); }
テストを実行すると pass します。少しずつテストと本体を実装していきます。
テスト
/** * プロパティファイルに適切なプロパティがなかったときはデフォルトがセットされる<br> * static 変数からプロパティの値を取り出す<br> * */ public void testDefault() { try { // 空のプロパティファイルを作成 File propertyFile = new File(DIRPATH, FILENAME); OutputStreamWriter out = new OutputStreamWriter(new FileOutputStream(propertyFile)); out.write(""); out.close(); InitParam.setProperties(FILENAME); // メソットの実行 String ds = InitParam.DataSourceName; // 取り出し assertEquals("java:comp/env/jdbc/MSSQLDS", ds); // 評価 } catch (Exception e) { e.printStackTrace(); fail(); } }
本体
/** * プロパティの読み込み * @param propertyFile プロパティファイル名 */ public static void setProperties(String propertyFile) throws Exception { String s = null; Properties props = new Properties(); props.load( new FileInputStream( propertyFile ) ); s = getProperty(props, "DataSourceName"); if(s != null) { DataSourceName = s; } } /* * プレフィックスをつけてプロパティを読み込む */ private static String getProperty(Properties props, String property) { return props.getProperty(PREFIX + property); }
「static メソットでプロパティファイルから読み込んで static 変数にセットする」 のテスト
/** * static メソットでプロパティファイルから読み込んで static 変数にセットする<br> * static 変数からプロパティの値を取り出す<br> */ public void testDataSourceName() { try { // プロパティファイルを作成 File propertyFile = new File(DIRPATH, FILENAME); OutputStreamWriter out = new OutputStreamWriter(new FileOutputStream(propertyFile)); out.write("lab.DataSourceName=Test"); out.close(); InitParam.setProperties(FILENAME); String ds = InitParam.DataSourceName; assertEquals("Test", ds); } catch (Exception e) { e.printStackTrace(); fail(); } }
できあがったテストとクラス
そして本物のプロパティファイルを作成します。
############################################################################## # # # name: lab.properties # desc: アプリケーション固有の設定を行う # ############################################################################### #------------------------------------------------------------------------------ # データソース名を定義 # Tomcat: web.xml と server.xml に設定 # WebLogic: web.xml と weblogic.xml に設定 #----------------------------------------------------------------------------- - lab.DataSourceName=java:comp/env/jdbc/MSSQLDS