Java テスト JUnitクラスが見つかりません with Spring Boot

JUnit5が起動できないエラーの対処方法です。

自分が実装している環境は以下の通りです。

  • IDE=Eclipse
  • SpringBootプロジェクト
  • JUnit5ライブラリを使用
実装したコード(テスト対象クラス)
public class Lesson5 {
    /**
     * シンプルなメソッド定義、メンバメソッドとスタティックメソッドの実装
     */
    public void code5_1() {
        System.out.println("湊さん、こんにちは");
    }
}
テストクラス
import org.junit.jupiter.api.BeforeAll;
import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;

@SpringBootTest
public class Lesson5Test {
    private static Lesson5 target;

    @BeforeAll
    public static void init() {
        target = new Lesson5();
    }

    @Test
    public void code5_1Test() {
        target.code5_1();
    }
}

まず結論としては、Springframeworkのアプリケーションで実装するクラスでないとうまくいかないというところです。つまりは、Springフレームワークのアノテーションをつけたクラスのテストでないとうまく動かないという事です

そして、自分の目的としては単純に単体テストを実行したいだけなので、SpringBootは不要だというところです。

今は使わないけど、後々にSpringBootの機能を使用したいのでこの様なつくりになっています。

単体テストを行うのにJUnit5で行おうとしたけども、「JUnitクラスが見つかりません。」という文言がポップアップされてテストが動きませんでした。

なので、JUnit5ではなく、JUnit4を使用するように修正しました。

具体的には、使用している以下のクラスを次のものに変更しました。
<変更前>
org.junit.jupiter.api.Test;

<変更後>
org.junit.Test

修正後JUnitクラス
import org.junit.BeforeClass;
import org.junit.Test;

public class Lesson5Test {
    private static Lesson5 target;

    @BeforeClass
    public static void init() {
        target = new Lesson5();
    }

    @Test
    public void code5_1Test() {
        target.code5_1();
    }
}

これでJUnitが動くようになります。無理をしてJUnit5を使用する必要はどこにもありませんでした。

そして、おかしなことに改めてJUnit5のコードに直したらうまく動きました。
ちなみに、@SpringBootアノテーションを消して実装していますが、これも「JUnitクラスが見つかりません」というポップアップが表示されました。

public class Lesson5Test {
    private static Lesson5 target;

    @BeforeAll
    public static void init() {
        target = new Lesson5();
    }

    @Test
    public void code5_1Test() {
        target.code5_1();
    }
}

ふしぎな。。。

JUnitの使い方~テストクラスの作成と実行~


JUnitの設定を行う。

EclipseでJUnitの設定を行います。

  1. プロジェクトを右クリック
  2. ビルドパスを選択する
  3. ライブラリの追加を選択
  4. JUnitを選択

テストするためのクラスを作成する。

今回は、サンプルなので簡単なものです。
ずばり、下のようなクラスを作成しました。

package jp.zenryoku.sample;

/**
 * JUnitの作成から実行までのサンプルクラス
 * @author 作成者の名前
 *
 */
public class JUnitSample {
    /** 定数 */
    private static final String TITLE = "JUnitサンプル";
    /** フィールド変数 */
    private int age;

    public JUnitSample() {
        // 年齢を設定する
        age = 10; // とりあえずは10歳にする
    }

    /**
     * @return age
     */
    public int getAge() {
        return age;
    }

    /**
     * @param age セットする age
     */
    public void setAge(int age) {
        this.age = age;
    }

}
  • 定数として「TITLE」を定義
  • フィールド変数に年齢を定義
  • コンストラクタで年齢を10に設定
  • メソッドとして年齢のGetterSetterを作成

JUnitテストクラスを作成

テストクラスを作成するときは、(自分の常識内では)以下のように作成します。

  1. パッケージ名はテスト対象クラスと同じ
  2. テスト対象クラス+Testという名前にする

テストクラスを作成するときには、テスト対象クラスを定数として保持してしまうと楽なのでそのようにしています。状況によりstatic(静的)でやるべきか、そうしないべきかの判断は、使用したいアノテーションで判断するとよいと思います。

例:
1.テストクラスを起動するときに一度だけ起動するのを「@BeforeClass」アノテーションを使用するならば、static修飾子をつける必要がある。
2.テストケースの実行時に必ずコンストラクタを起動するのであれば、「@Before」を使用するとよい

\@Beforeを使用する場合

上に作成したテストケースを修正して、「@BeforeClass」アノテーションを使用しないパターンで実装してみます。

ここでコンストラクタに引数を追加したものを追加します。具体的には下のようなコードになります。

public JUnitSample(int age) {
    this.age = age;
}

そして、実行するテストに関しては、下のようになります。

package jp.zenryoku.sample;

import static org.junit.jupiter.api.Assertions.*;

import org.junit.Before;
import org.junit.BeforeClass;
import org.junit.Test;

/**
 * JUnitテストクラス: パッケージ名が同じなのでインポートしなくてよい
 * @author 作成者の名前
 */
public class JUnitSampleTest {
    /** テスト対象クラス(テスト実行時には必ず1つなのでstaticでよい) */
    private JUnitSample target;

    /**
     * このテストクラスをインスタンス化するときの処理。
     * このメソッドは1度だけ動く
     */
    @BeforeClass
    public static void initClass() {
        // テスト対象クラスをインスタンス化
//      target = new JUnitSample();
    }

    /**
     * controll + spaceでインポートできる。
     * テストを実行する前の準備処理、テストケースが動くたびに動く
     */
    @Before
    public void initTest() {
//      // 15歳に設定しなおす。
//      target.setAge(15);
        target = new JUnitSample(12);
    }

    /**
     * テストケース1:年齢(age)が15歳に設定されているか確認する。
     */
    @Test
    public void test01() {
        // 警告が出るのでstaticインポートに変更する。
        assertEquals(12, target.getAge());
    }
}

そして、コンストラクタ以外でも年齢の設定を変更できることを確認するテストケースを追加します。

/**
 * テストケース2:年齢を5歳に設定しなおしたときのテスト
 */
@Test
public void test02() {
    target.setAge(5);
    assertEquals(5, target.getAge());
}

テスト作成の方法

関連ページ一覧

Eclipseセットアップ(Windows版)

Eclipse セットアップ(MAC版)

  1. Java Install Eclipse〜開発ツールのインストール〜
  2. TensorFlow C++環境〜EclipseCDTをインストール〜
  3. Setup OpenGL with JavaJOGLを使う準備 for Eclipse
  4. Eclipse Meven 開発手順〜プロジェクトの作成〜
  5. Java OpenCV 環境セットアップ(on Mac)
  6. Eclipse SceneBuilderを追加する
  7. JavaFX SceneBuilder EclipseSceneBuilder連携~

Java Basic一覧

  1. Java Basic Level 1 〜Hello Java〜
  2. Java Basic Level2 〜Arithmetic Calculate〜
  3. Java Basic Level3 〜About String class〜
  4. Java Basic Level 4〜Boolean〜
  5. Java Basic Level 5〜If Statement〜
  6. Java Basic Summary from Level1 to 5
  7. Java Basic Level 6 〜Traning of If statement〜
  8. Java Basic Level8 〜How to use for statement〜
  9. Java Basic Level 8.5 〜Array〜
  10. Java Basic Level 9〜Training of for statement〜
  11. Java Basic Level 10 〜While statement 〜
  12. Java Basic Swing〜オブジェクト指向〜
  13. Java Basic Swing Level 2〜オブジェクト指向2〜
  14. サンプル実装〜コンソールゲーム〜
  15. Java Basic インターフェース・抽象クラスの作り方
  16. Java Basic クラスとは〜Step2_1〜
  17. Java Basic JUnit 〜テストスイートの作り方〜

Git関連

  1. Java Git clone in Eclipse 〜サンプルの取得〜
  2. Eclipse Gitリポジトリの取得 GitからソースをPullしよう〜
  3. IntelliJ IDEA GitGitリポジトリからクローン〜

JavaFX関連ページ

  1. Eclipse SceneBuilderを追加する
  2. JavaFX SceneBuilder 〜EclipseとSceneBuilder連携~
  3. JavaFX SceneBuilder〜ボタンにメソッドを割り当てるワンポイント〜
  4. Java プロコンゲーム 〜見た目の作成(SceneBuilderの使用)〜

ステップアップ関連ページ一覧

  1. Java 初めてでも大丈夫〜ステップアッププログラミングのススメ〜
  2. ステップアッププログラミング〜Java FxでHelloWorld解説〜
  3. Java StepUpPrograming〜JavaFX で四則計算〜
  4. Java StepUpPrograming〜JavaFXで画面切り替えを作る1〜
  5. Java StepUpPrograming〜JavaFXで画面切り替え2ボタン作成〜
  6. Java StepUpPrograming〜JavaFXで画面切り替え3アクション〜
  7. Java StepUpPrograming〜JavaFXで画面切り替え4Pane切り替え〜
  8. Java StepUpPrograming〜JavaFXで画面切り替え5WebEngine

JavaFX + ND4Jで機械学習準備

  1. JavaFX + ND4J〜数学への挑戦1:ND4Jのインストール〜
  2. JavaFX + ND4J〜数学への挑戦2: 行列の計算〜
  3. Java + ND4J 〜数学への挑戦3: ベクトル(配列)の作成方法〜

オブジェクト指向関連ページ

  1. [オブジェクト指向の概念1〜OracleDocのチュートリアル1〜](https://zenryokuservice.com/wp/2019/10/301. /%e3%82%aa%e3%83%96%e3%82%b8%e3%82%a7%e3%82%af%e3%83%88%e6%8c%87%e5%90%91%e3%81%ae%e6%a6%82%e5%bf%b5-%e3%80%9coracledoc%e3%81%ae%e3%83%81%e3%83%a5%e3%83%bc%e3%83%88%e3%83%aa%e3%82%a2%e3%83%ab%ef%bc%91/)
  2. オブジェクト指向の概念2〜クラスとは〜

Java はじめて31 〜JUnitでのテスト駆動型開発8: 処理をつなげたテスト〜

イントロダクション

今まではユニットテスト(単体テスト)をやっていましたが、複数のクラスを実行するテストケースも作成することができます。
プログラム的には、実行するプログラムを増やすだけですが。。。

イメージとしては、メインメソッドを動かすテストを実行するようなイメージです。
そうすれば、メインメソッドを動かした方が早いような気がしますが、大掛かりなアプリケーションの場合は、そうもいきません。

なので、「足し算をする処理のテスト」「ファイルを読み込むテスト」とテストを行った後に、口座に入金するテストをするというような形です。

今回のような小さなプログラムでは、あまり意味がありませんが。。。

今回は、今まで作成した1処理を「機能」として動かせることを確認するテストケースを作成します。
通常のやり方では、1.実装、2.テストと分けた場合の「2.テスト」にあたります。

機能テスト

仕様は以下の通りです。

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

今までの実装、テストで行くと「3」が実装したものに相当します。なので、これをテストケースで確認する様にします。
現状では、スタブのままなので未実装になっています。
なのでテストケースを先に作成します。
ちなみに、最終的なコードはGithubにあります。

  1. KozaManager.java
  2. KozaManagerTest.java
@Test
public void testFileRead() {
    if (target.isFile() == false) {
        fail("ファイルが存在していません");
    }
    List<Data> dataList = target.readFile();
    // データは1件
    assertEquals(1, dataList.size());
    // ファイルにあるデータ
    Data data = dataList.get(0);
    assertEquals("test", data.getName());
    assertEquals("passwd", data.getPassword());
}

とりあえずで、上の様に作成しました。初めにファイルの存在チェック処理を確認して、ファイルが存在しないならテスト失敗。
次にファイルの読み込みを行い、そのデータを取得しデータが想定通りのものが入っているか確認します。

余談

テストを複数回行っていたので「koza.csv」にデータが複数作成されていました。ヘッダー付きなのでこれはダメなテストになってしまうので、ちょっと修正します。
<修正1>
「ファイルが存在するときにはファイル作成をしない」が抜けていたのでこれを追加します。

// ファイルそ新規で作成するとき
if (file.exists() == false) {
    // ヘッダー部分の出力
    build.append(this.createCSVHeader());
    // ファイル書き込み処理
    write.write(build.toString());
    write.newLine();
}

そして、修正後のメソッドは以下の様になります。

public void dataOutput(Data data) throws IOException {
    if (file.canWrite() == false) {
        throw new IOException("ファイルの書き込みができません: " + file.getAbsolutePath());
    }
    // おおよそのデータサイズを指定すると余計なメモリを使用しなくて済む
    StringBuilder build = new StringBuilder(50);
    // ファイルを新規で作成するとき
    if (file.exists() == false) {
        // ヘッダー部分の出力
        build.append(this.createCSVHeader());
        // ファイル書き込み処理
        write.write(build.toString());
        write.newLine();
    }
    // StringBuilderのクリア
    build.setLength(0);
    // データ部分の書き込み
    build.append(data.getName() + ",");
    build.append(data.getPassword());
    write.write(build.toString());
    write.newLine();
    write.close();
}

これで、ファイルが存在しているのに新たにファイルを作成することがなくなります。

しかし、テストはうまくいきませんでした。
これの原因は、テストケースにありました。

@Test
public void testFileRead() {
    if (target.isFile() == false) {
        fail("ファイルが存在していません");
    }
    List<Data> dataList = target.readFile();
    // データは1件
    assertEquals(1, dataList.size());
    // ファイルにあるデータ
    Data data = dataList.get(0);
    assertEquals("test", data.getName());
    assertEquals("passwd", data.getPassword());
}

取得したデータのサイズ(ファイルの行数)は1の想定ですが、テストを実行するたびにデータが追加されるので、テストが毎回同じ結果になりません。

これは良くない

なので、ここもちょっと修正します。

// データは0件ではない
assertNotEquals(0, dataList.size());

こんな感じで修正しました。そして、複数件あっても作成されるデータは同じなので初めの一件目が想定通りの値かどうか確認します。ここでちょっと注意「初めの1行目はヘッダー行なのでデータ部ではないですが、取得したときはリストの1番目に設定されています。なので以下の様に修正します。

public void testFileRead() {
    if (target.isFile() == false) {
        fail("ファイルが存在していません");
    }
    List<Data> dataList = target.readFile();
    // データは0件ではない
    assertNotEquals(0, dataList.size());
    // ファイルにあるデータは2行目から
    Data data = dataList.get(1);
    assertEquals("test", data.getName());
    assertEquals("passwd", data.getPassword());
}

こんな感じでファイル読み込みの一連の機能をテストしました。これと同様に、他ものもテストしました。わかりづらいですが、上のキャプチャにテストケースが、4つあります。
ファイル作成、ファイル存在チェックの処理の他は読み込みと書き込みをテストしています。

ちょっと締まりが悪いですが。今回はこれまでにします。

ここまでで31回分の学習を行いました。ここまで来たら(もしかすると途中で。。。)自分で考えて学習を進めることができるレベルまで来ているのではないでしょうか?「いや?」という声がないと良いのですが、「物事を伝えるのは至難」とも言います。また別な角度で同じことを記述したいと思います。
Jaba Basic Lv1」と称して再度記載しました。こちらも併せてご利用ください。

でわでわ。。。

<<< 前回

<Java関連の動画リスト>

<JUnit関連の動画リスト>



Java はじめて30 〜JUnitでのテスト駆動型開発7: テストクラスの実装方法〜

イントロダクション

前回までは、部分的にテストケースなどを作成してきましたが、テストケースの作成をするために必要なこと〜実装までを記載したいと思います。

今回は、まとめ的に、JUnitでの実装をやります。今までは、コードを書き終わったものを記載していましたが、今回はコードを書きながら記載していこうと思います。自分のやり方になりますが。。。

テストクラスの実装方法

仕様確認1

  1. koza.csvファイルが存在するときはファイルを読み取り、それをDataクラスに設定し、リストにして返す
  2. koza.csvがない場合は、システムエラーを出す

上の仕様を満たす様に、テストケースを考えます。シンプルなもので、単純に実装すれば良さそうです。
「〜そうです。」と記載したのは、実装などはやってみないとわからないこともあるのでこの様に記載しました。早速作ってみます。

テストケースを作る

まずは、単純にテストクラスを作成します。このクラス名は「テスト対象クラスの名前+Test」という形で作成します。
テストクラスと実装するクラスのセットが、そうするとわかりやすいからです。すでに実装していますが「初めから作る」という前提で記載します。

※ 「スタブ」というのは空実装、つまりメソッドの名前、引数、返り値を書いているけど中身のない状態です。
```java
/** スタブ実装 */
public void stubMethod() {
}
```

作成するクラス
KozaManager(実装クラス)
KozaManagerTest(テストクラス)

<実装クラス>

public class KozaManager {

    public Listl<Data> fileRead() {
        // 実装前なのでスタブにします。
    }

} 

<テストクラス>

public class KozaManagerTest {
    @Test
    public void testFileRead() {
        // これもスタブ
    }
}

現状は、上記の様な状態です。
そして、考えます。何を?。。。仕様の1番目「koza.csvファイルが存在するときはファイルを読み取り、それをDataクラスに設定し、リストにして返す」にはどの様なテストが必要か?を考えます。単純に考えるならば以下の様になります。

  1. ファイルの存在を確認する処理が想定通りに動くか?
  2. ファイルが存在するならば、それを読み込みデータリストを返却するか?

そして、もう1つの仕様「koza.csvがない場合は、システムエラーを出す」に関しては

  1. ファイルが存在しないときはシステムエラーを出し、アプリケーションを終了するか?

それぞれ、上の様なチェック(テスト)を行います。ぶっちゃけて、まずはこの単純な確認を行ってから次に「穴はないか?」を考えれば良いと思います。

なのでシンプルにその様なテストケースを作成します。
まずは、「ファイルの存在を確認する処理が想定通りに動くか?」これを確認するために実装クラスとテストクラスの両方を修正します。着手するのは1つずつなので安心ください。
ますは、テストケース(テストクラス)
<テストクラス>

public class KozaManagerTest {
    @Test
    public void testIsFile() {
        // ファイルの存在チェック処理の確認
    }
    // 今はテストしないのでコメントアウト
    // @Test
    public void testFileRead() {
        // これもスタブ
    }
}

とりあえずは、ファイルの存在チェック処理を動かすためのテストケース(メソッド)を作成しました。
ここで、足りないものがあります。

  1. テスト対象クラス(実装するクラス)
  2. ファイル存在チェック処理メソッド

通常の開発だと、これらを実装してからテストしますが。先に箱(スタブ)だけ作ってしまいます。
<実装クラス>

public class KozaManager {
    public boolean isFile() {
        // とりあえずスタブです。ファイルが存在していることを確認する
    }
    public Listl<Data> fileRead() {
        // 実装前なのでスタブにします。ファイルを読み込めることを確認する
    }

} 

そして、ちょっと考えてみると「ファイルの存在チェック処理を行うのに、ファイル名が必要だな。。。」と気がつくと思います。

ここが悩みどころ

ファイル名を(引数で)渡す処理方法と、ファイル名を固定して渡す方法のどちらもできるので「どちらの手段が汎用性、保守性共に高いだろうか?」と悩んでみます。
自分の結論は「引数でファイル名を渡す」方が良いと思ったのですが、すでに実装ているコードではコンストラクタでCSVファイルを読み込んでいるので今回は、引数なしでのメソッドにします。つまり、処理の順序的にCSVファイルを読み込んでから呼び出す処理になっているという意味です。コンストラクタの実装は下のように作っています。※設計的にビミョウな感じがします。。。
```java
public class KozaManager {
/** ファイルへの書き出しクラス */
private BufferedWriter write;
/** ファイルの読み込みクラス */
private BufferedReader read;
/** 取得(作成)するファイルクラス */
private File file;

/** コンストラクタ */
public KozaManager() {
// 操作するファイルを指定する
file = new File(FILE_PATH);
try {
write = new BufferedWriter(new FileWriter(file, true));
if (file.exists()) {
read = new BufferedReader(new FileReader(file));
}
} catch (IOException ie) {
ie.printStackTrace();
System.out.println("ファイルオープンに失敗しました。" + ie.getMessage());
System.exit(-1);
}
}
}
```

なので以下の様なコードになります。
<実装クラス>

public class KozaManager {
    /** 作成するファイルが存在するかチェック */
    public boolean isFile() {
        // fileはフィールド変数
        return file.exists();
    }
    public Listl<Data> fileRead() {
        // 実装前なのでスタブにします。
    }
} 

<テストクラス>
テストの実行前に、テスト対象クラスのインスタンスを作成(newする)し、フィールド変数にセットします。
つまり、以下の順序で処理が走ります。

1. 「\@Before」アノテーションのついているメソッド
2. 「\@Test」アノテーションのついているメソッド

テストケースの数だけ「\@Before」が動きます。

public class KozaManagerTest {
    @Before
    public void initTest() {
        target = new KozaManager();
    }

    @Test
    public void testIsFile() {
        // コンストラクタでファイルが作成されることに注意
        assertTrue(target.isFile("koa.csv"));
    }

    // 今はテストしないのでコメントアウト
    // @Test
    public void testFileRead() {
        // これもスタブ
    }
}

実行結果は下にあります。

まとめ

「テストケースを作る=実装を行う」順序

1.作成するプログラムの仕様を確認する

  1. 仕様を満たすテストケースを考える
  2. 考えたテストケースを実装する(スタブ)※テストする内容をコメントしておくと良い
  3. 実行するクラス(KozaManager)を実装する
  4. テストケースを実行(KozaManagerTest)して、処理が正しいことを確認

クラス、メソッドの依存度が高いと右を修正した後に左を修正。。。と無限ループすることがあるのでそれぞれの処理が(なるべく)独立するように作りましょう。

でわでわ。。。

<<< 前回 次回(ラスト) >>>

<Java関連の動画リスト>

<JUnit関連の動画リスト>



Java はじめて29 〜JUnitでのテスト駆動型開発6: ファイル読み込みのテスト〜

イントロダクション

前回は、ファイルの出力を実装しました。
もちろんテストケースありきの実装です(テスト駆動開発)。ここまでくると、だんだんと実装とテストと慣れてくると思います。
横っ飛びして、別なプログラムを作成し始めてみるのも1つです。

わからなくなったら、また調べれば良いのです。

今回は、今迄作成した「ファイル存在チェック」と「ファイル作成、更新」処理を繋げてテストします。

この段階で、ようやくテストらしいテストになります。ちなみにこのテストケースも実装前に作成出来ますが、小さなレベルで、テスト仕様を考える→実装→テスト実施…とやった方が早い気がします。

口座作成処理

ようやく、仕様レベルの話に戻って来ました。このテストケースはコーダー銀行に口座を開設する処理に当たりますので、実際に動かす時と同じような入力(テストなのでデータ)を渡して実行します。テストコードは下のようになります。

このテストケースが通ったらとりあえずは、製造完了です。お疲れ様でした。

ひと段落したので、一旦休むも良し、このまま突走るのも良し。

他の事に着手してみるも良し!

動く事が大事

何が言いたいかと言うと、プログラムは何かを作る、仕組みを作るなどに使用する。若しくは単純に触りたいだけ…など色々あると思いますが、ちゃんと動くモノを作った方が、実力もつくし、作ったもので遊べるし、良い事ずくめだと思うので、色々と作ってみるのが良いと思います。

今迄やって来ているのは、サンプルなので…主な目的は「Javaの学習」になっています、あまり作りたいものには届かないと思います。しかし、基礎を学べる様になっているのと、コンソールアプリなので応用はいくらでも出来ます。早い話が、コンソールアプリが作れれば、あとは環境が違うだけなので大まかな流れは理解できるずです。。。

続き

前置きは、このくらいにして、続きをやります。

早い話が、今迄作成したメソッドを続けて呼び出し、それらが想定通りに動くか?の確認を行います。

作成したメソッドは以下のものです。

そして、上のメソッドを結合してやる場合のテストケースから考えます。

データの読み込み

仕様

  • ファイル存在チェックを行いファイルが存在すれば読み込む
  • 存在しなければファイル作成を行う

仕様に関してはこの部分のみをみていましたが、ファイルの読み込みをした後に、データが入っているはずなので、これを取得する必要があります。

この部分は実装していないので、実装が必要です。とりあえずは、目の前のテストを片付けてしまいます。テストコードは下の様になりました。テストを実施しながら実装するので手直しをするからこうなりました。と言う表現を使いました。

テストが通ったので、次の事を考えます。つまり、ここまでは想定通りに行ったという事です。

データの取得

次は、読み込んだファイルのデータをクラスに設定してやる事を考えます。

ファイルに保存してあるデータを読み込んで、プログラムで使いやすい様にデータクラスを使ってデータを保持します。「保持」と言うのは、プログラムが止まると消えてしまう情報なので「保持」と言う言葉を使いました。

ちなみに、ファイルに保存すれば、プログラムが止まっても情報は残しておけます。

現状では、Dataクラスを使用してファイルにデータを書き込んでいます。
ちなみにデータクラスは下の様なコードになります。

<補足>
データクラスとは:クラスにフィールド変数、ほかはGetter,Setterが定義してあるだけのクラスのことです。
わりかし身近なものとしては、ログインするときのユーザー情報クラスがこれに当たります。設計思想によりユーザー情報クラスに何かしらの処理を持たせることがあるかもしれませんが、筆者が作るのであれば、ユーザークラスの親(スーパー)クラスに持たせます。

はっきり言って、設計思想のレベルなのでどちらが良いとかっていう話ではありません。。。

public class Data {
    /** ユーザー名 */
    private String name;
    /** パスワード */
    private String password;

    /** 
     * コンストラクタ。口座情報を保持するクラスのインスタンスを生成。
     * 
     * @param name 口座のユーザー名
     * @param password 口座のパスワード
     */
    public Data(String name, String password) {
        this.name = name;
        this.password = password;
    }
    /**
     * @return the name
     */
    public String getName() {
        return name;
    }
    /**
     * @param name the name to set
     */
    public void setName(String name) {
        this.name = name;
    }
    /**
     * @return the password
     */
    public String getPassword() {
        return password;
    }
    /**
     * @param password the password to set
     */
    public void setPassword(String password) {
        this.password = password;
    }
}

読み込み時にもこのクラスが使えます。
まとめると以下の様な手順でファイルを読み込みます。

  1. ファイルを開く(コンストラクタで実装ぞ済み)
  2. ファイルを1行ずつ読み込みDataクラスへ設定
  3. データクラスをリストにして返却する

以上の様な手順でファイルからデータを取得します。
そして、これをテストケースにします。

テスト仕様

上の手順そのままですがこれを確認するためのテストケースを作成します。そしてこれもとりあえずは「スタブメソッド」を作成します。

/**
 * ファイルを読み込みデータをリストにして返却する
 * @return List<Data> CSVファイルのデータリスト
 */
public List<Data> readFile() {
    return null;
}

このメソッドはJavaDocコメントにある様に、リストにしてデータを返しますので、java.util.Listインターフェースを使用してデータを返却します。
Listインターフェースの配列型リスト=ArrayListクラスを生成してデータをセットする様に実装します。コードは以下の様になります。

public void testFileRead() {
    List<Data> dataList = target.readFile();
    // データは1件
    assertEquals(1, dataList.size());
    // ファイルにあるデータ
    Data data = dataList.get(0);
    assertEquals("test", data.getName());
    assertEquals("passwd", data.getPassword());
}

このテストケースを実行しエラーが出ない様なコードを作成します。一応、CSVファイルはファイル作成時に出力したデータが設定されていることを確認しています。

まとめ

テストケースを作成して実行。。。これに関してどんなことをやったのか?に関して記載しました。
「データクラス」というのが新しい単語として出てきましたが、上記の通り「フィールド変数、Getter,Setterのみのクラス」というだけです。

でわでわ。。。

<<< 前回 次回 >>>

<Java関連の動画リスト>

<JUnit関連の動画リスト>