2014-03-28 11 views
5

ich spöttisch eine HttpServletRequest, in Servlet Aufruf gibt es neue Werte in Anforderung, da mit derselben Anfrage wir dispaching Anfrage zu einigen Jsp so Anfrage Objekt wird als Eingabe-Objekt zu Servlet als verwendet gut als Ausgang für nächste Seite.Wie man HttpServletRequest mit Mockito

verspottete ich alle Eingabeparameter, sondern für alle request.setAttribute(), wird mein Code nichts zu tun, da es eine verspottete Klasse ist, sagen, wenn ich

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

habe ich null bekommen Weil ich nicht gegeben haben jedes Verhalten für Request.getAttribute ("a"), und ich kann nicht, es ist meine Antwort für die nächste Seite, so dass erklären, ich brauche 2 Verhalten mein Anfrageobjekt so teilweise verspotten, und ich bin nicht in der Lage zu spionieren oder zu tun, teilweise verspotten darauf bis jetzt. irgendwelche Ideen?

Code:

//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); 
} 
+0

Können Sie Ihre spöttische Versuch zeigen? – Mureinik

+0

Ich habe den Beitrag wieder geändert. siehe insertSumIntoDB (request.getAttribute ("sum")) Dies ist tatsächlich insertSumminDb (null), weil ich kein Verhalten für request.getAttribute ("sum") angegeben habe; – Vivek

Antwort

5

Sie speichern müssen Attribute in einer Sammlung:

// 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()); 
6

Spring MockHttpServletRequest und MockHttpServletResponse nützlich sind für diesen Zweck. Z.B.

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 

dann kann ich nennen myclass.method (Anfrage, Antwort, ...) und prüfen, ob irgendein Attribut in der Anfrage richtig eingestellt worden ist, z.B.

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

MockHttpServletRequest und MockHttpServletResponse funktionieren, wo Mock (HttpServletRequest.class) ausfällt, zum Beispiel, wo man den eigentlichen Inhalt einer Anfrage Attribut zurück bekommen müssen, die innerhalb Ihrer Geschäftslogik vorher festgelegt wurde.

+4

MockHttpServletRequest und MockHttpServletResponse sind ein Teil von Spring. Wenn Sie Spring nicht verwenden, stehen sie Ihnen nicht zur Verfügung. –

+0

@JimJarrett du hast recht; Auf der anderen Seite ist die Spring-Test-Abhängigkeit, die die 'MockHttpServlet ...' -Klassen enthält, ziemlich leicht (benötigt nur spring-core), also lohnt es sich vielleicht, sie in den Testbereich für schönere Tests zu ziehen. – jhyot