Java はじめて27 〜JUnitでのテスト駆動型開発4: 追加修正と実装〜

今回は、前回同様に「JUnitでのテストケースから、テストをクリアできる様に実態クラスを作成します。」が最終的にファイルを出力する前に、出力したファイルの存在チェック処理を作る必要があるので、そちらの処理(テストケース)を先に作成します。

追加修正

前回までに作成したものをまとめると以下の様になります。
<口座管理処理の要件>

  1. ファイルを操作するためのオブジェクトを作成する
  2. ファイルにデータをCSV形式で書き出す。
  3. ファイルが存在するのであれば、それを読み込みデータを保持する

<実装済み>
1のオブジェクト作成のみ

<テストケース>
ファイル出力のテストケースとKozaManagerクラス(本体)の実装時に、以下の不足する実装(処理)があることに気がつく

  1. 出力するCSVのヘッダー部分の作成処理
  2. デストラクタ
  3. 作成したファイルの存在確認
  4. ファイルの内容確認

上記の様なことが抜けていたので、作成するテストケースも作成順序が変わってきてしまいました。元の設計に抜けがあった様です。つまり、以下の様な順序で作成することになります。

  1. ファイルの存在チェック処理
  2. ファイルにCSVデータを出力する処理
  3. ファイルの内容確認処理
  4. ファイル出力の処理(上の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」がついていないところです。つまりこのテストケースは実行されません。では動かしてみます。

とりあえずはテスト成功の様です。ここでファイルの存在チェックができたので、次はファイル出力のテスト実装に入ろうと思います、

でわでわ。。。