2012-02-13 23 views
1

私は依存関係注入を利用するためにサーブレットをどのようにリファクタリングするのですか?

public class SaveXmlServlet extends HttpServlet { 

private CacheService cacheService; 

public void init(ServletConfig config) throws ServletException { 
    cacheService = CacheServiceLocator.cacheService(); 
} // init 

がどのように私は...

  1. がとても依存性注入を利用するために、私のサーブレットを再設計することができます...私はこのサーブレットを持っているのJava 6でのTomcat 6.0.33を使用していますmockitoのような模擬フレームワークが独自の "cacheService"実装を注入できること
  2. 私のjvmにキャッシュサービスのインスタンスが1つしかないことを保証します。現在、 "CacheServiceLocator.cacheService()"という行がこれを保証しています。

?私はSpringやGuiceのようなフレームワークを使用していない(または使用することを許可していない)。これをリファクタリングすることに感謝します。ありがとう、 - Dave

+2

* "私はSpringやGuiceのようなフレームワークを使用していません(または使用することを許可しています)。"オープンソースなので、いくつかの洞察を得ることができます。しかし、...どのように車輪を再発明するのが理にかなっていますか?私は "私は許されない"問題を解決することに集中するだろう。それはあなたの現在の問題よりはるかに大きいです。 – BalusC

+0

しかし、技術的な問題はずっと簡単です! –

答えて

1

私はあなたがフレームワークを使用しないように誰かを叩くことをお勧めしますが、いくつかのオプションがあります。 2つの手早さ。私は他の人がいると確信しています。私は最初に強引な道を行くだろう。

EasyMock/MockitoとPowerMockの組み合わせを使って静的クラスをモックできます。技術的には、テスト中の動作を得るために何かを変更する必要はありません。

サーブレットのinitパラメータまたはJNDIリソースによって提供されるクラス名を使用して、キャッシュロケータのインスタンスを作成できます。同じセッターを提供することは、ユニット/等を可能にする。それをクラスに設定するテスト。

+0

「サーブレットのinitパラメータまたはJNDIリソースによって提供されるクラス名を使用して、キャッシュロケータのインスタンスを作成できます。」というコードサンプルを提供できますか?まだ見ていません。また、私はJUnitテストと私の通常のアプリケーションで "cacheService"メンバフィールドがどのように設定されているかを制御できる限り、CacheServiceLocator自体は気にしません。ありがとうございます、 - – Dave

+0

@Dave ...私は追加することができますかわからない、 "ライブ"システムで実装の新しいインスタンスを作成する文字列クラス名を使用して、テストでセッターを使用します。 –

+0

ああ、今はっきりしています...私はClass.forNameメソッド(またはそれが何であったか)を通してクラスインスタンス化の使用を忘れていました。あなたの解決策は非常に高く評価されています。 - – Dave

関連する問題