今回は、前回同様に「JUnitでのテストケースから、テストをクリアできる様に実態クラスを作成します。」が最終的にファイルを出力する前に、出力したファイルの存在チェック処理を作る必要があるので、そちらの処理(テストケース)を先に作成します。
追加修正
前回までに作成したものをまとめると以下の様になります。
<口座管理処理の要件>
- ファイルを操作するためのオブジェクトを作成する
- ファイルにデータをCSV形式で書き出す。
- ファイルが存在するのであれば、それを読み込みデータを保持する
<実装済み>
1のオブジェクト作成のみ
<テストケース>
ファイル出力のテストケースとKozaManagerクラス(本体)の実装時に、以下の不足する実装(処理)があることに気がつく
- 出力するCSVのヘッダー部分の作成処理
- デストラクタ
- 作成したファイルの存在確認
- ファイルの内容確認
上記の様なことが抜けていたので、作成するテストケースも作成順序が変わってきてしまいました。元の設計に抜けがあった様です。つまり、以下の様な順序で作成することになります。
- ファイルの存在チェック処理
- ファイルにCSVデータを出力する処理
- ファイルの内容確認処理
- ファイル出力の処理(上の1-3を全て通して行う確認)
余談ですが、テストケースを作成することで「不足ケース」を見つけることができます。当然不足があれば、テストは想定通りには動きません、プログラムですから「気を利かして。。。」なんてことはやってくれません(笑)
ファイル存在チェック
はっきり言って1行で終わります。
コンストラクタで参照(作成)するファイルオブジェクトは作成しているのでそれを使用します。
なので、もともと下の様なコンストラクタを使っていましたが、修正します。
<元のコード>
public class KozaManager { /** ファイルへの書き出しクラス */ private BufferedWriter write; /** ファイルの読み込みクラス */ private BufferedReader read; /** コンストラクタ */ public KozaManager() { // 操作するファイルを指定する File file = new File("resources/koza.csv"); try { write = new BufferedWriter(new FileWriter(file)); if (file.exists()) { read = new BufferedReader(new FileReader(file)); } } catch (IOException ie) { ie.printStackTrace(); System.out.println("ファイルオープンに失敗しました。" + ie.getMessage()); System.exit(-1); } } /** デストラクタ */ @Override protected void finalize() throws Throwable { write = null; read = null; } /** * データクラスを受け取り、CSVファイルを出力する(書き出しを行う) * @param data コーダー銀行のユーザー情報 */ public void dataOutput(Data data) { } }
<修正後のコード>
・フィールドを追加します。
・コンストラクタの「file」をフィールド変数のFIleオブジェクトに変更します。
public KozaManager() { // 操作するファイルを指定する file = new File(FILE_PATH); try { write = new BufferedWriter(new FileWriter(file)); if (file.exists()) { read = new BufferedReader(new FileReader(file)); } } catch (IOException ie) { ie.printStackTrace(); System.out.println("ファイルオープンに失敗しました。" + ie.getMessage()); System.exit(-1); } }
本来であれば、ファイルの作成はプログラムからやるのですが、順番的にファイルの存在チェックを先にやるので手で作成します。
以下の様なファイルです。
名前, パスワード テスト太郎, 1234 テスト花子, 2345 テストたくのじ, 3456
これを「koza.csv」と名前をつけてEclipseのresourcesフォルダの直下に配置(作成)します。。。
が、以前起動したテスト(コンストラクタのテスト)の実行時にファイルが作成されていたので(ファイルの中身は空)、テストを起動した時点でファイルが存在することになります。
なので、テストケースとしては以下の様なものになります。
public void testIsFile() { assertTrue(target.isFile()); }
これも1行で終わりました(笑)
しかし、これでテストを実行しても上のコードはテストとして実行されません、なぜなら「@Test」がついていないからです。
なので以下の様にテストクラスを修正します。
public class KozaManagerTest { /** テスト対象クラス */ private KozaManager target; /** * テストの初期化 * 各テスト実行前に起動する */ @Before public void initClass() { target = new KozaManager(); } /** * コンストラクタが起動したかどうかを確認する * テストケース */ @Test public void testIsInstance() { assertNotNull(target); } /** * ファイルの存在チェック処理の確認 */ @Test public void testIsFile() { assertTrue(target.isFile()); } /** * ファイルにデータを出力し保存するテストケースです。 */ public void testFileCeate() { Data data = new Data("名前", "パスワード"); try { target.dataOutput(data); } catch(IOException ie) { ie.printStackTrace(); fail(); } } }
ここでのポイントはファイル出力のテストケースに「@Test」がついていないところです。つまりこのテストケースは実行されません。では動かしてみます。
とりあえずはテスト成功の様です。ここでファイルの存在チェックができたので、次はファイル出力のテスト実装に入ろうと思います、
でわでわ。。。