4

このイディオムに精通している必要があると思います。これは、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
  }
});

私はこのイディオム/パターンをよく使用しましたが、最近それをテストしようとしました、そしてそれは私に頭痛を与えています...

ResourceManagerクラスとClientクラスを分離してテストするにはどうすればよいですか?私は、これがそれらを非常に緊密に結合しているので、簡単にそれを行うことができないことを発見しました。

アイデアは大歓迎です。

よろしく

4

3 に答える 3

5

匿名クラスは非常に小さくて単純であるため、それらを含む/使用する構造をテストするだけで十分だと思います。

あなたがそれをテストする必要性を感じるほど複雑で、大きく、重要なものを持っているなら、それをフルクラスにします。

于 2009-07-17T22:34:01.007 に答える
1

匿名の内部クラスはあまり使用しないでください(使用する場合)。テストが難しいことを除けば、コピーアンドペーストせずに再利用することは事実上不可能です。

ほとんどの場合、それらを完全なクラスにすることで、柔軟性が高まり、オブジェクト指向設計が改善されます(クラスを追加すると、ほとんどの場合、設計が改善されます)。

ちなみに、あなたが言ったように、クロージャにも同じ問題があります-再利用するのは難しいです。

于 2009-07-17T22:32:28.623 に答える
1

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

編集しますが、無名関数でコードをテストする方法を引き続き見つける必要があります。

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

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

于 2009-07-17T22:42:42.407 に答える