イントロダクション
前回までは、テストケースの作成に注力していましたが。今回は、プログラムを動かすためのクラス、実装の部分に入ろうと思います。
ここでは、イメージ的に、テストと実装を同時にやるようなイメージです。
実装
今回は、前回同様に「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();
}
/**
* テストの後始末
* 各テスト実行前に起動する
*/
@After
public void terminate() {
target.finalize();
}
/**
* コンストラクタが起動したかどうかを確認する
* テストケース
*/
@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」がついていないところです。つまりこのテストケースは実行されません。では動かしてみます。
とりあえずはテスト成功の様です。ここでファイルの存在チェックができたので、次はファイル出力のテスト実装に入ろうと思います、
でわでわ。。。
<Java関連の動画リスト>
<JUnit関連の動画リスト>