2011-06-23 11 views
47

私は、HttpServletRequestオブジェクトで、特にrequest.getParameterMapとrequest.getParameterを使ってオブジェクトを構築するサービスを提供しています。URL文字列から模擬HttpServletRequestを作成していますか?

提供URLを取るための簡単な方法がある場合、私は思っていた、文字列の形式で、私は私でそれをテストできるように

String url = "http://www.example.com/?param1=value1&param"; 

と簡単にはHttpServletRequestをオブジェクトに変換言いますユニットテスト?または、少なくともrequest.getParameterMapとrequest.getParameterが正しく動作するようにしますか?

答えて

29

スプリングはスプリングテストモジュールにMockHttpServletRequestを持っています。

mavenを使用している場合は、pom.xmlに適切な依存関係を追加する必要があります。あなたはmvnrepository.comで春のテストを見つけることができます。

+0

これは間違いなくそれを行うための最も簡単な方法のように見えます。どうもありがとう! – Anthony

+2

私はこれを動作させることはできません。どのように使用する必要がありますか? – varunl

+0

'spring-test'の依存関係の数はちょっと狂っています。すでにいくつかの衝突でつまずいた:( –

2

通常、これらの種類のテストは、実際にサービスに接続する統合テストでテストします。単体テストを行うには、サーブレットのdoGet/doPostメソッドで使用されるオブジェクトをテストする必要があります。

サーブレットメソッドに多くのコードを置くことを望まない場合は、操作を処理するためのBeanクラスを作成し、サーブレットAPIオブジェクトではなく独自のオブジェクトを渡すことができます。モックする

+1

もう一度、メソッドが入力として特定のタイプのパラメータを取るために起こるという理由で、テストカバレッジ(つまり、コードの堅牢性)を高める機会を渡すのはなぜですか? – pap

+1

それは、サーブレットAPIを単体テストするか、あなた自身のコードを単体テストしようとしていますか? –

+3

"一般的に"サーブレットメソッドにコードを入れたくないのですが、実際には常にそうなります。 、ユーティリティメソッド、構文解析、検証、モデル変換、場合によってはビジネスロジック(恐怖!)などがありますが、それ以降はユニットテストをしたいと思うでしょう。サーブレットAPIを模擬することは、それをテストすることの反対であり、テストケースから完全に取り除いています。 – pap

35

最も簡単な方法HttpServletRequest

  1. 匿名のサブクラスを作成します。

    HttpServletRequest mock = new HttpServletRequest() 
    { 
        private final Map<String, String[]> params = /* whatever */ 
    
        public Map<String, String[]> getParameterMap() 
        { 
         return params; 
        } 
    
        public String getParameter(String name) 
        { 
         String[] matches = params.get(name); 
         if (matches == null || matches.length == 0) return null; 
         return matches[0]; 
        } 
    
        // TODO *many* methods to implement here 
    }; 
    
  2. 使用jMockMockito、またはいくつかの他の汎用モックフレームワーク:

    HttpServletRequest mock = context.mock(HttpServletRequest.class); // jMock 
    HttpServletRequest mock2 = Mockito.mock(HttpServletRequest.class); // Mockito 
    
  3. HttpUnitを使用'ServletUnitと要求をまったく模倣しないでください。

23

ここでは、MockHttpServletRequestを使用する方法である:

// given 
MockHttpServletRequest request = new MockHttpServletRequest(); 
request.setServerName("www.example.com"); 
request.setRequestURI("/foo"); 
request.setQueryString("param1=value1&param"); 

// when 
String url = request.getRequestURL() + '?' + request.getQueryString(); // assuming there is always queryString. 

// then 
assertThat(url, is("http://www.example.com:80/foo?param1=value1&param")); 
+1

このMockHttpServletRequestを使用すると、実際には完全に機能するHttpServletRequestが必要になります。 – Silentbang

+0

queryStringを設定すると、パラメータマップはMockHttpServletRequestで自動的に更新されません。したがって、コードでrequest.getParameter()を使用する場合は、最初は冗長であるように見えるかもしれませんが、最初にテスト設定を明示的に設定する必要があります。 – inovaovao

関連する問題