2

私は初心者です。このメソッドをテストする必要があります-ファイルへの書き込み/ファイルからの読み取り。アドバイスをもらえますか?これをどのように行うことができますか、junit test またはより良い EasyMock のみを使用しますか? 何をすることをお勧めできますか?

public class AbsFigure {

public void write(String fileName, List<FigureGeneral> figuresList) {
    try {
        PrintWriter out = new PrintWriter(
                new File(fileName).getAbsoluteFile());
        try {
            for (int i = 0; i < figuresList.size(); i++) {
                out.println(figuresList.get(i).toString());
            }
        } finally {
            out.close();
        }
    } catch (IOException e) {
        e.printStackTrace();
        System.out.println("Cannot write to file!");
    }
}

// read from file
private ArrayList<FigureGeneral> figureReader(String fileName) {
    String line = null;
    ArrayList<FigureGeneral> myListFigure = new ArrayList<FigureGeneral>();

    try {
        File myFile = new File(fileName);
        FileReader fileReader = new FileReader(myFile);
        BufferedReader bufferedReader = new BufferedReader(fileReader);

        while ((line = bufferedReader.readLine()) != null) {
            myListFigure.add(fromStringToFigureGeneral(line));
        }
        System.out.println(myListFigure);
        bufferedReader.close();

    } catch (FileNotFoundException e) {
        System.out.println("File which You loking for not found!");
    } catch (NumberFormatException e) {
        e.printStackTrace();
    } catch (IOException e) {
        System.out.println("Wrong input!");
    }

    return myListFigure;
}

// change from String to FigureGeneral(Triangle or Rectangle)
private FigureGeneral fromStringToFigureGeneral(String line) {
    String[] arrayLines = line.split(" ");
    FigureGeneral figures = null;

    if (arrayLines[0].equals("triangle")) {
        figures = new Triangle(Double.parseDouble(arrayLines[1]),
                Double.parseDouble(arrayLines[2]), "triangle");
    } else {
        figures = new Rectangle(Double.parseDouble(arrayLines[1]),
                Double.parseDouble(arrayLines[2]), "rectangle");
    }

    return figures;
}

public void launch(AbsFigure absFigure) {
    List<FigureGeneral> figuresList = absFigure.generateRandomFigures(5);

    AreaCompare areaCompare = new AreaCompare();
    Collections.sort(figuresList, areaCompare);

    absFigure.write("test.txt", figuresList);
    figureReader("test.txt");
}

public static void main(String[] args) {
    AbsFigure absFigure = new AbsFigure();
    absFigure.launch(absFigure);
}
}

私はもう少しコードを書きました、そしてあなたは状況をよりよく理解することができます. これをテストする方法をお勧めできることを願っています(おそらく2つのバリアントを表示できます)。

4

3 に答える 3

3

メモリ I/O を使用すると、ディスク I/O の使用を完全に回避できます。そのために EasyMock は必要ありません。単純に入力ストリームと出力ストリームが異なるだけです。結果の出力ストリーム (書き込み) と結果の FigureGeneral オブジェクトのリスト (読み取り) をチェックすることで、メソッドが JUnit で正しく機能していることを確認できます。

ステップバイステップ:

1) 書き込みメソッドが使用する出力ストリームを注入します。

次のようなシグネチャを持つ出力ストリームを取得する既存の「書き込み」メソッドによって呼び出される別の「書き込み」メソッドを追加できます。

public void write(OutputStream outputStream, List<FigureGeneral> figuresList);

元の書き込みメソッドは、次のようにメソッドを呼び出して上記のメソッドをラップします。

write(new FileOutputStream(new File(fileName).getAbsoluteFile()), figuresList);

2) InputStream を使用して read メソッドに対して上記のトリックを繰り返します。

これにより、次のようなシグネチャを持つ read メソッドが得られます。

private ArrayList<FigureGeneral> figureReader(InputStream inputStream);

3) ByteArrayInputStream と ByteArrayOutputStream を使用する JUnit テストを記述し、上記のメソッドを呼び出します。

ByteArrayOutputStream で toByteArray() を呼び出し、結果をアサートすることで、書き込みメソッドの結果を確認できます。特定の ByteArrayInputStream を渡した後、リスト内の値をアサートすることで、読み取りメソッドの結果を確認できます。

テスト クラスに追加できる (疑似) メソッドを次に示します。これにより、異なる性質の FigureGeneral オブジェクトのリストを出力ストリームに書き込み、入力ストリームから読み戻して、等しいことをアサートできます。

public void assertCanBeWrittenAndReaback(List<FigureGeneral> inputFigure) {
  ByteArrayOutputStream outStream = new ByteArrayOutputStream();
  absFigure.write(outStream, inputFigures);
  List<FigureGeneral> outputFigure = absFigure.figureReader(new ByteArrayInputStream(outStream.toByteArray()));
  assertEqualsFigureGeneralLists(inputFigure, outputFigure);
}

4) これにより、かなり良いテスト カバレッジが得られます。それでも、100% のテスト カバレッジを実現したい場合は、ラッパーになった元の write および readFigure メソッドをテストする必要があります。

元のメソッドは、入力ストリームと出力ストリームを使用する同名のメソッドにリダイレクトするだけです。EasyMock を使用してリダイレクトを確認するには、2 つのリダイレクト メソッドをオーバーライド (またはこれらのメソッドをインターフェイスの背後に配置する場合は実装) し、適切な FileInputStream および FileOutputStream オブジェクトを受け取ることをアサートします。ただし、FileOutputStream コンストラクターには既存のファイルが必要なため、そのためにいくつかの一時ファイルが必要になります。ただし、テストケースで一時ファイルを使用しても大きな問題は見られません。

于 2013-01-06T11:06:55.460 に答える
1

この SO questionのように、一時的なテスト ファイルを作成し、その内容を確認することをお勧めします。

于 2013-01-06T10:52:53.023 に答える