2012-10-18 11 views
20

Mam funkcję, która wygląda dla parametru zapytania i zwraca wartość logiczną:Jak wyśmiać HttpServletRequest?

public static Boolean getBooleanFromRequest(HttpServletRequest request, String key) { 
     Boolean keyValue = false; 
     if(request.getParameter(key) != null) { 
      String value = request.getParameter(key); 
      if(keyValue == null) { 
       keyValue = false; 
      } 
      else { 
       if(value.equalsIgnoreCase("true") || value.equalsIgnoreCase("1")) { 
        keyValue = true; 
       } 
      } 
     } 
     return keyValue; 
    } 

mam zarówno JUnit i EasyMock w moim pom.xml, jak mogę iść o wyśmianie HttpServletRequest?

+3

Poniższa odpowiedź na to pytanie, jak dobrze napisane, ale ja zwykle opowiadają się za refactoring kod tak, że większość nietrywialne logika znajduje się na bardziej odpowiednim poziomie abstrakcji. Jeśli to możliwe, kpiny HttpServletRequest stają się niepotrzebne. –

Odpowiedz

8

HttpServletRequest jest podobnie jak każdy inny interfejs, dzięki czemu można drwić go po EasyMock Readme

Oto przykład, w jaki sposób jednostka przetestować metoda getBooleanFromRequest

// static import allows for more concise code (createMock etc.) 
import static org.easymock.EasyMock.*; 

// other imports omitted 

public class MyServletMock 
{ 
    @Test 
    public void test1() 
    { 
     // Step 1 - create the mock object 
     HttpServletRequest req = createMock(HttpServletRequest.class); 

     // Step 2 - record the expected behavior 

     // to test true, expect to be called with "param1" and if so return true 
     // Note that the method under test calls getParameter twice (really 
     // necessary?) so we must relax the restriction and program the mock 
     // to allow this call either once or twice 
     expect(req.getParameter("param1")).andReturn("true").times(1, 2); 

     // program the mock to return false for param2 
     expect(req.getParameter("param2")).andReturn("false").times(1, 2); 

     // switch the mock to replay state 
     replay(req); 

     // now run the test. The method will call getParameter twice 
     Boolean bool1 = getBooleanFromRequest(req, "param1"); 
     assertTrue(bool1); 
     Boolean bool2 = getBooleanFromRequest(req, "param2"); 
     assertFalse(bool2); 

     // call one more time to watch test fail, just to liven things up 
     // call was not programmed in the record phase so test blows up 
     getBooleanFromRequest(req, "bogus"); 

    } 
} 
12

Stosuj pewne szykany np. Mockito lub JMock, które ma kpiącą pojemność takich obiektów.

W Mockito, można zrobić wyśmianie jak:

HttpServletRequest mockedRequest = Mockito.mock(HttpServletRequest.class); 

Szczegółowe informacje na temat Mockito patrz: How do I drink it? na stronie Mockito.

W JMock, można zrobić wyśmianie jak:

Mockery context = new Mockery(); 
HttpServletRequest mockedRequest = context.mock(HttpServletRequest.class); 

Szczegółowe informacje na temat JMock, patrz: jMock - Getting Started

+0

Dlaczego nie są wymagane rzuty? –

+0

Ponieważ używają one generycznych z wnioskami typu, jak powinna każda dobra nowoczesna biblioteka. – Hiro2k

+0

Przekazujesz '.class' jako argument do wyszydzania metod. –