2009-07-17 11 views
3

私は匿名クラスをテストするには?

...あなたが閉鎖

//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 
    } 
}); 

のためのJavaの言い訳のようなもの、私はこのイディオム/パターンをたくさん使用したがrecently I tried to test it、そしてそれは私に頭痛を与えているこのイディオム、に精通している必要があります信じています

ResourceManagerクラスとClientクラスをどのようにして個別にテストするのですか?私はこれを強く結びつけて、あなたが簡単にできないことが分かった。

アイデアありがとうございます。

よろしくお願いいたします。

答えて

1

匿名型をテストできる実際の型にしたくない場合は、execute()関数でコードをテストできる別の関数に移動することを検討してください。その後、匿名型は謙虚なオブジェクト(http://xunitpatterns.com/Humble%20Object.html)になります。

を編集してください。ただし、無名関数でコードをテストする方法を探し続ける必要があります。

C#のような型保証言語では、匿名コードで仮想メンバー関数を呼び出すことでこれを行うことができます。このテストでは、仮想関数呼び出しをオーバーライドしてクラスを特化し、呼び出されたことを確認します。

Javascriptのような非タイプセーフな言語では、呼び出されるメンバ関数はすでに仮想です。したがって、派生型を作成するのではなく、呼び出されたメンバー関数を記録バージョンで上書きすることができます。

0

匿名の内部クラスを(もしあれば)使用しないでください。テストが難しいことを除けば、コピー&ペーストなしで再利用することは事実上不可能です。

ほとんどの場合、クラスをフルにすると、柔軟性が増し、オブジェクト指向設計が改善されます(クラスを追加すると、ほとんどの場合デザインが改善されます)。

ところで、あなたが言ったように、閉鎖も同じ問題があります - 再利用するのは難しいです。

+3

コード内でクロージャを使用すると、コードの再利用が少なくて済むようになります。しかし、それについては何も間違っていません。実際には、クロージャを中心とするフレームワークは、(同じ述語を異なる述語などで再利用することができるため)コードの再利用を大幅に増加させます。匿名クラスの場合も同様。 –

+0

私はパベルと一緒にいます... Javaで作業しているときにクロージャが本当に欠けています –

+1

クロージャとして渡すアイテムをどのように再利用できるのか説明してください。私はクロージャと同じくらい再利用するためにストレートOOコードを書くことができますが、私が渡しているそのスニペットを再利用する方法はわかりませんが、クロージャが匿名の内部クラスよりも優れているかもしれません。匿名で渡すコードを再利用する方法は事実上ありません。 –

5

私は匿名のクラスは非常に小さくてシンプルでなければならないと思っています。

あなたがテストする必要があると感じるように、とても複雑で大きな重要なことがあれば、それをフルクラスにする。

関連する問題