2012-10-18 7 views
20

Ich habe eine Funktion, die für einen Abfrageparameter sucht und gibt einen boolean:Wie die HttpServletRequest zu verspotten?

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; 
    } 

ich beide junit und EasyMock in meinem pom.xml haben, wie gehe ich über spöttisch die HttpServletRequest?

+3

Die unten Antwort auf diese Frage, wie gut geschrieben, aber ich plädiere dafür, die normalerweise für den Code Refactoring, so dass die meisten der nicht-triviale Logik befindet sich auf einer angemesseneren Ebene der Abstraktion. Wenn das möglich ist, wird HttpServletRequest überflüssig. –

Antwort

8

HttpServletRequest ist ähnlich wie jede andere Schnittstelle, so dass Sie es, indem Sie die EasyMock Readme

Hier ein Beispiel, wie wird Einheit testen Sie Ihr getBooleanFromRequest Methode

// 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

Verwenden Sie einige spöttische Rahmenbedingungen, z. Mockito oder JMock, die mit der Mockkapazität solcher Objekte kommt.

In Mockito können Sie spöttisch als:

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

Einzelheiten zu Mockito finden Sie unter: How do I drink it? auf der Mockito Ort.

In JMock können Sie spöttisch als:

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

Einzelheiten zu JMock, lesen Sie bitte: jMock - Getting Started

+0

Warum sind keine Gussformen erforderlich? –

+0

Weil sie Generika mit Typinferenz wie jede gute moderne Bibliothek verwenden sollten. – Hiro2k

+0

Sie übergeben '.class' als Argument für Mock-Methoden. –