1

私は Java プログラミングにまったく慣れていませんが、正しい用語を使用し、誤解をできるだけ避けるように努めます。

私の問題に非常によく似たトピックへの回答をいくつか見つけましたが、それらが私の問題にどのように適合するかわかりません。あるいは、実際には適合しないだけかもしれません。それらのいくつかはモックされたオブジェクトを使用していますが、私の場合はそれが正しいオプションかどうかわかりません。

概要

ランダムにアクセスされたバイナリ ファイルから情報が読み込まれるオブジェクトの配列が必要です。バイナリ ファイルの最初のバイトは、データがファイルに格納される方法を定義するファイルのヘッダーです。基本的には、ファイル内の目的のデータの位置を計算するのに役立ついくつかのフィールドの長さを示します。

そこで、 UnitListElementオブジェクトで指定された目的のデータをUnitオブジェクトにロードするために呼び出されるメソッドをテストしたいと思います。このため、バイナリ ファイルの 1 回の読み取りのみに焦点を当てています。

より詳細なビュー

いくつかの属性を持つUnitという Java クラスがあります。たとえば、 a、*b* およびcとします。この属性の値は、メソッド呼び出しgetDataFromBinFileでロードされます。

public class Unit{
    public double[] a;
    public double[] b;
    public double[] c;

getDataFromBinFile(UnitListElement element){
    <here loads the data from the binary file with random access>
}
}

バイナリ ファイルからデータをロードする方法は、バイナリ ファイルを開き、バイナリ ファイル内の目的のデータにアクセスします。読み取る必要のあるデータは、UnitListElementオブジェクトで指定されます。

public class UnitListElement{
    public String pathOfFile;
    public int beginToReadAt;  // info related to where the desired data begins
    public int finishReading;  // info related to where the desired data ends
} 

バイナリ ファイルから読み取る最初と最後のバイト位置を計算するために、バイナリ ファイルのヘッダーと共に使用される属性beginToReadAtおよびfinishReading時間参照。

そこで、メソッドgetDataFromBinFile(unitListEl)を呼び出して、返された情報が正しいかどうかをテストする必要があります。

ソリューションのオプション

最初のオプション

同様の問題を抱えたいくつかの投稿では、モック オブジェクトの使用を提案しています。オブジェクトのモックに関するドキュメントを見つけようとしましたが、初心者向けの簡単なガイドは見つかりませんでした。したがって、モック オブジェクトをあまり理解していませんが、他のオブジェクトとの相互作用だけでなく、バ​​イナリ ファイルの読み取りをテストしたいので、このケースには当てはまらないというのが私の印象です。

2番目のオプション

もう 1 つのオプションは、ヘルパー メソッドを使用してテスト内でテスト用のバイナリ ファイルを作成し、fi を @BeforeClass で作成し、この一時ファイルを使用してテストを実行してから、@AfterClass メソッドで削除することです。

質問

TDD アプローチを検討する際のベスト プラクティスは何だと思いますか? この場合、モックオブジェクトは本当に適合しますか? もしそうなら、完全な初心者向けの基本的な例を含むドキュメントはありますか?

またはその一方で、ファイルの作成は読み取り方法のテストに適していますか?

ありがとう

よろしくお願いします。

4

4 に答える 4

1

モッキングはあなたのケースに適用することができますが、実際にはここで厳密に必要というわけではありません。必要なのはgetDataFromBinFile、ファイルからバイトを読み取るコードから実際のデータ処理ロジックを切り離すことです。

これは(少なくとも)2つの方法で実現できます。

  • モックの場合:UnitListElementファイル読み取りコードを、バイト配列を取得して返すインターフェイスメソッドの背後に隠し、これをで使用しgetDataFromBinFileます。次に、ファイルにアクセスせずに事前定義されたバイトを返すモックリーダーを使用して、テストでこのインターフェイスをモックできます。(または、ファイル読み取りロジックをUnitListElementそれ自体に移動することもできます。今のところ、PODクラスのようです。)
  • モックなし:の署名を変更して、のgetDataFromBinFile代わりにバイト配列パラメーターを取得しますUnitListElement。実際の本番コードでは、で記述されたファイル位置からデータを読み取り、UnitListElementそれをに渡すことができgetDataFromBinFileます。単体テストでは、任意のバイナリデータを直接渡すことができます。(この場合、メソッドの名前を次のような名前に変更するのが理にかなっていることに注意してくださいgetDataFromBytes。)

モックには、これまでEasyMockを使用してきました。そのドキュメントはかなり理解しやすいと思います。それがお役に立てば幸いです。

于 2012-05-08T08:45:22.597 に答える
0

私はTDDの経験があまりありません。ファイルへの読み取り/書き込みをテストするときにモックを使用する必要はありません。テストを実行するファイルのテストバージョンを用意するのが最善のオプションです。モックは、ユースケースのテスト可能なオブジェクトを簡単に作成できない場合、たとえばサーバーとの対話をテストする場合に使用することを目的としています。

于 2012-05-08T08:38:19.000 に答える
0

テストバイナリファイルを作成するだけです。

このプロセスはファイルを読み取っています。したがって、ファイル システムについて心配する必要はありません。ファイルは常に決定論的です(別の話になる読み取り中にファイルを変更した場合)

オブジェクトを読み込んだ後にオブジェクトをテストしたい場合は、テストでオブジェクトを作成することをお勧めします (サウンド ファイルのように非常に難しい場合を除きます)。

また、ファイルではなくストリームを抽象化することをお勧めしますが、テスト ファイルを使用してこれをテストします。ところで:テストファイルが小さいことを確認してください。結局のところ、これはテストです。

「テストはファイルシステムにヒットするはずがない」と主張する人もいるかもしれませんが、.class ファイルはどこからロードされると思いますか?

また、Java classLoader を介してストリームを取得します

this.getClass().getResourceAsStream("yourfile.name");

ハッピーテスト!

ルウェリン・ファルコ

http://www.approvaltests.com

于 2012-05-10T13:38:28.873 に答える
0

テスト バイナリ ファイルを作成することは好みません。読み込まれるファイルの形式が変更されると、テスト ファイルも (したがってテストも) 変更されることになるからです。

TDD アプローチに従っているため、「UnitListElement」クラスのテストを書き出す必要があります。したがって、この状況ではモックの方が優れたソリューションと思われます。あなたの目的は、「UnitListElement」クラスのメソッドではなく「getDataFromBinFile」メソッドをテストすることです(現在)。したがって、「UnitListElement」クラス(またはそれによって継承され、getDataFromBinFile メソッドに渡されるインターフェース)をモックできます。「UnitListElement」をモックするということは、「getDataFromBinFile」メソッドでアクセスされるたびに、定義済みまたは特定の戻り値をクラス内の任意のメソッド呼び出しに返すことができることを意味します。最後に、「getDataFromBinFile」メソッドでモックから返された値を使用し、ビジネス ロジックが実行された後にメソッドの戻り値をアサートできます。私は持っていないここ

于 2012-05-08T09:05:10.263 に答える