web-dev-qa-db-ja.com

JUnitテストケースのファイルを比較するにはどうすればよいですか?

JUnitについて少し学びたいので、自分が取り組んでいる小さなプロジェクトにJUnitを実装したいと思います。

私が読んだチュートリアルはすべて、特定の出力を持つメソッドを参照しています。

私の場合、出力はファイルですが、どうすればこれを行うことができますか?簡単な例はありますか?これで私を助けることができるアプローチはありますか?

ファイルは、voidプライベートメソッドによってビルドされた生のテキストファイルです。

22
Saikios

特定の入力セットに対して正しい出力ファイルを取得し、それらの入力を使用してvoidメソッドを呼び出すテストを設定し、検証済みの出力ファイルをメソッドによって生成されたものと比較する必要があります。メソッドの出力先を指定する方法があることを確認する必要があります。そうしないと、テストが非常に脆弱になります。

@Rule
public TemporaryFolder folder = new TemporaryFolder();

@Test
public void testXYZ() {
    final File expected = new File("xyz.txt");
    final File output = folder.newFile("xyz.txt");
    TestClass.xyz(output);
    Assert.assertEquals(FileUtils.readLines(expected), FileUtils.readLines(output));
}

Commons-io FileUtils を使用してテキストファイルを簡単に比較し、JUnitの TemporaryFolder を使用して、テストの実行前に出力ファイルが存在しないようにします。

23
Jon Freedman

使用する - junitx.framework.FileAssertjunit-addonsプロジェクト からのクラス。その他のリンク:

方法の1つ:

assertEquals(Java.lang.String message,
             Java.io.Reader expected,
             Java.io.Reader actual) 
3
Jarekczek

メソッドがファイルを書き込んだ後、単体テストでファイルを読み取り、正しく書き込まれているかどうかを確認できます。

もう1つの意味があるのは、メソッドを1つに分割して、そのデータを取得し、ファイルに書き込むだけのメソッドに返すことです。次に、最初のメソッドによって返されたデータに問題がないかどうかを確認できます。

そして、もう1つのもっともらしいアプローチは、データを書き込むメソッドにOutputStreamを渡すことです。 「実際のコード」では、FileOutputStream/FileWriterを渡すことができますが、テストコードでは、OutputStreamのモック実装を記述して、何が書き込まれているかを確認できます。それ。

2
Bozho

出力をストリームに入れるようにメソッドを制御できない場合は、メソッドがパラメーター(またはそのクラスのコンストラクター)でストリームを受け取るように、コードをリファクタリングする必要があると思います。

その後、テストは非常に簡単です。ストリームを確認するだけです。簡単にテストできるコードは、通常、優れたコードと同じです。

1
Amir Rachum

あなたの質問は単純に見えるかもしれませんが、それはユニットテストの核心にぶつかりますが、テスト可能な整形式のコードを書く必要があります。これが、一部の専門家が、最初に単体テストを作成し、次に実装クラスを作成するようにアドバイスする理由です。

あなたの場合、あなたのメソッドが期待されるファイルを実行して作成することを許可することをお勧めします。その後、ユニットテストでファイルが正しく形成されていることを分析できます。

1
Ashley Walton