web-dev-qa-db-ja.com

Mockitoを使用してHttpServletRequestを部分的にモックする方法

同じリクエストを使用してリクエストをいくつかのjspにディスパッチしているため、サーブレットコールではリクエストに新しい値が設定されているため、サーブレットへの入力オブジェクトおよび次のページの出力としてリクエストオブジェクトが使用されます。

私はすべての入力パラメーターをモック化しましたが、すべてのrequest.setAttribute()について、モック化されたクラスであるため、私のコードは何もしていません。

request.setAttribute(a,"10")
System.out.println("a = " + request.getAttribute("a"));

私はnull cuzを取得します。Request.getAttribute( "a")の動作を指定していないため、次のページに対する応答です。そのため、2つの動作が必要です。つまり、リクエストオブジェクトを部分的にモックする必要があります。これまでのところ、スパイしたり、それを部分的に模倣したりすることはできません。何か案は?

コード:

 //Testcase
   Myservlet.Java
public void doPost(request,response)
    {
         String a = request.getAttribute("a");
         String b = request.getAttribute("b");
         int sum = Integer.parseInt(a) + Integer.parseInt(b);
         request.setAttribute("sum",sum);
         //well in this example i can use sum what i calculated but in real senario i can't , i have to use request.getAttribute("sum")
         insertSumIntoDB(request.getAttribute("sum"));
    }
    }



  //testMyservlet.Java
   @test
public void testServlet()
 {
 HttpServletRequest request = mock(HttpServletRequest.class);
     HttpServletResponse response = mock(HttpServletResponse.class);
when(request.getAttribute(a)).thenReturn("10");
when(request.getAttribute(b)).thenReturn("20");
new Myservlet(request,response);
}
11
Vivek

属性をコレクションに格納する必要があります:

// Collection to store attributes keys/values
final Map<String, Object> attributes = new ConcurrentHashMap<String, Object>();     

// Mock setAttribute
Mockito.doAnswer(new Answer<Void>() {
    @Override
    public Void answer(InvocationOnMock invocation) throws Throwable {
        String key = invocation.getArgumentAt(0, String.class);
        Object value = invocation.getArgumentAt(1, Object.class);
        attributes.put(key, value);
        System.out.println("put attribute key="+key+", value="+value);
        return null;
    }
}).when(request).setAttribute(Mockito.anyString(), Mockito.anyObject());

// Mock getAttribute
Mockito.doAnswer(new Answer<Object>() {
    @Override
    public Object answer(InvocationOnMock invocation) throws Throwable {
        String key = invocation.getArgumentAt(0, String.class);
        Object value = attributes.get(key);
        System.out.println("get attribute value for key="+key+" : "+value);
        return value;
    }
}).when(request).getAttribute(Mockito.anyString());
7
Aure77

Springの MockHttpServletRequest および MockHttpServletResponse は、この目的に役立ちます。例えば。

    MockHttpServletRequest request = new MockHttpServletRequest();
    MockHttpServletResponse response = new MockHttpServletResponse();
    request.addHeader(HttpHeaders.Host, "myhost.com");
    request.setLocalPort(PORT_VALID); // e.g. 8081
    request.setRemoteAddr(REQUEST_IP); // e.g. 127.0.0.1

次に、myclass.method(request、response、...)を呼び出して、一部の属性がリクエストに正しく設定されているかどうかを確認できます。

    MyBean attr = (MyBean) request.getAttribute(ATTRIBUTE_NAME));
    // do my Assert.* stuff with 'attr'

MockHttpServletRequestとMockHttpServletResponseは、mock(HttpServletRequest.class)が失敗した場合に正常に機能します。たとえば、リクエスト属性の実際のコンテンツを取得する必要がある場合以前にビジネスロジック内で設定しました。

14
medveshonok117

Mockitoは実際の部分モックをサポートします: http://docs.mockito.googlecode.com/hg/org/mockito/Mockito.html#16

あなたのニーズに合うと思います

1
Thomas