2011-01-21 19 views
0

ユニットテストのクラスを設定するためのオプションを検討しています。この特定のクラスは、通常の状況下では常に同じ石鹸クライアント設定を使用する必要があります。私はクラスのユーザーが石鹸クライアントを使用するときに設定することに関心を持つ必要がないように感じる。または、それはまったく石鹸を使用していることに注意してください。ユニットテストのためのオプションの依存性注入

唯一の例外はユニットテストです。私はSoap_Clientをモックできるようにする必要があります。私はコンストラクタでsoapクライアントを作成し、オプションでsetSoapClient()で設定できる次のアプローチを考え出しました。

class WebServiceLayer 
{ 
    const WSDL_URL = 'https://www.example.com/?WSDL'; 

    private $soapClient; 

    public function __construct() 
    { 
     $this->soapClient = new Soap_Client(self::WSDL_URL); 
    } 

    public function setSoapClient(Soap_Client $soapClient) 
    { 
     $this->soapClient = $soapClient; 
    } 

    public function fetchSomeResponse() 
    { 
     $soapClient = $this->soapClient; 
     return $soapClient->someRequest(); 
    } 
} 

これは有効な方法ですか?私が見ている唯一の問題は、 "私が聞いた"コンストラクタ内のクライアントをインスタンス化することは避けるべきことです。

私は他のクラスの前にこのジレンマに遭遇しました。だから、これに関して人々の意見を得るのは本当にいいことです。

+0

クライアントが遅延ロードではなくコンストラクタで作成されるように、この例を変更しました。 – AaronSzy

答えて

2

あなたは標準的なセッター注射を使用しています。奇妙なことは、Getterで新しいクライアントを返すことだけです。注入されていなければnullを返さないのはなぜですか?

+0

私はgetterに典型的な設定でsoapクライアントを作成させています。しかし、今私はそれを見ても、コンストラクタでそれを作成するだけかもしれません。それはより簡単です。 – AaronSzy

+1

WebServiceLayerがSOAPクライアントのインスタンスを生成することにより、依存関係注入の目的を破ることができます。本当に疎結合コードが必要な場合は、デフォルト値でも注入する必要があります。 –

+0

ああ、意味があります。私はそれがどのように機能しているかについての知識は、そのクラスのユーザーの関心事である必要はないと考えていました。しかし、私はゆるやかなカップリングを得るためにあなたがしなければならないトレードオフのようなものだと思います。 私はこの質問が私の根本的な問題に対処すると思います:http://stackoverflow.com/questions/1005473/must-dependency-injection-come-at-the-expense-of-encapsulation – AaronSzy