匿名クラスをテストするには?
-
16-09-2019 - |
質問
私は
閉鎖のためのJavaの言い訳の一種である、あなたはこのイディオムに精通している必要があります信じています//In the "Resource Manager" class
public void process(Command cmd){
//Initialize
ExpensiveResource resource = new ExpensiveResource();
//Use
cmd.execute(resource);
//Release / Close
resource.close();
}
//In the Client class...
manager.process(new Command(){
public void execute(ExpensiveResource res){
//Do things with the resource
}
});
私は多くなく、最近Iこのイディオム/パターンを使用しましたそれををテストするために試みたが、それは私に頭痛を与えている...
どのように単独でのResourceManagerとクライアントクラスをテストするのですか?私はあまりこのタイトカップル彼らはあなたが簡単にそれを行うことができないということがわかっています。
アイデアが評価されています。
よろしく
解決
、あなたがテストすることができ、別の関数にその実行()関数内のコードを移動することを検討。匿名型は、その後、謙虚なオブジェクトになり( http://xunitpatterns.com/Humble%20Object.html)。
の編集のがありますが、匿名関数内のコードをテストするための方法を見つける続けるべきである。
C#のようなタイプセーフ言語では、これは匿名のコード呼び出し仮想メンバ関数を有することによって行うことができます。テストは、それが呼ばれるチェック、仮想関数呼び出しをオーバーライドしたクラスを専門としています。
Javascriptのようなnontypesafe言語では、と呼ばれるメンバ関数は、すでに仮想です。だから、派生型を作成するのではなく、あなたが記録したバージョンと呼ばれるメンバ関数を上書きすることができます。
他のヒント
私は匿名クラスは、それらを使用して/を含む構造のテストが十分であることをとても小さくてシンプルであるべきだと思います。
あなたがそれ完全なクラス作り、それをテストする必要性を感じていることが重要、大きな、非常に複雑なものを持っている場合。
多くの匿名内部クラスを使用しないでください。別にテストすることは困難であることから、彼らは、コピー&ペーストせずに再利用することは事実上不可能です。
ほとんどの時間は、それらの完全なクラス作ることは(ほとんど常に複数のクラスを追加すると、あなたのデザインを向上させる)より柔軟性を可能にし、あなたのオブジェクト指向設計を改善します。
あなたはクロージャを述べたように、ところで、また同じ問題を抱えている - 再利用するのは困難
。