2014-04-30 4 views
5
  1. Stavo cercando di scrivere unit test per Servlet usando sprint-test utilizzando finto oggettoErrore oggetto la creazione MockHttpServletResponse per unit testing

  2. mia dipendenza Maven è:

    <dependency> 
        <groupId>org.springframework</groupId> 
        <artifactId>spring-test</artifactId> 
        <version>4.0.3.RELEASE</version> 
    </dependency> 
    

Voglio testare solo servlet Java come di seguito seguente libro TDD PRATICO E ACCETTAZIONE TDD FO R JAVA DEVELOPER:

package sample; 

import java.io.IOException; 

import javax.servlet.ServletException; 
import javax.servlet.http.HttpServlet; 
import javax.servlet.http.HttpServletRequest; 
import javax.servlet.http.HttpServletResponse; 

public class LoginServlet extends HttpServlet { 
    private boolean isValid; 

    /** 
    * 
    */ 
    private static final long serialVersionUID = 2473252741884321641L; 

    @Override 
    public void init() throws ServletException { 
     super.init(); 

    } 

    @Override 
    public void doPost(HttpServletRequest req, HttpServletResponse resp) 
      throws IOException { 
     String user = req.getParameter("j_username"); 
     String pass = req.getParameter("j_password"); 
     if (isValidLogin(user, pass)) { 
      resp.sendRedirect("/frontpage"); 
      req.getSession().setAttribute("username", user); 
     } else { 
      resp.sendRedirect("/invalidlogin"); 
     } 

    } 

    private boolean isValidLogin(String user, String pass) { 
     return isValid; 
    } 

    public void setValid(boolean isValid) { 
     this.isValid = isValid; 
    } 

} 

Il mio codice è:

package sample; 
    import static org.junit.Assert.assertEquals; 
    import org.junit.Test; 
    import org.springframework.mock.web.MockHttpServletRequest; 
    import org.springframework.mock.web.MockHttpServletResponse; 

    public class SprintTestProb { 

    @Test 
    public void wrongPasswordShouldRedirectToErrorPage() throws Exception { 
     MockHttpServletRequest request = new MockHttpServletRequest(); 
     MockHttpServletResponse response = new MockHttpServletResponse(); 
     request.addParameter("j_username", "gyanu"); 
     request.addParameter("j_password", "wrongpassword"); 
     LoginServlet login = new LoginServlet(); 
     login.setValid(false); 
     login.doPost(request, response); 
     assertEquals("/invalidlogin", response.getRedirectedUrl()); 
    } 

} 

ho ottenuto l'errore sulla linea risposta MockHttpServletResponse = new MockHttpServletResponse(); come segue:

java.lang.ExceptionInInitializerError 
    at org.springframework.mock.web.MockHttpServletResponse.<init>(MockHttpServletResponse.java:76) 
    at sample.SprintTestProb.wrongPasswordShouldRedirectToErrorPage(SprintTestProb.java:14) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
    at java.lang.reflect.Method.invoke(Method.java:606) 
    at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:47) 
    at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12) 
    at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:44) 
    at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17) 
    at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:271) 
    at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:70) 
    at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:50) 
    at org.junit.runners.ParentRunner$3.run(ParentRunner.java:238) 
    at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:63) 
    at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:236) 
    at org.junit.runners.ParentRunner.access$000(ParentRunner.java:53) 
    at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:229) 
    at org.junit.runners.ParentRunner.run(ParentRunner.java:309) 
    at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:50) 
    at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38) 
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:467) 
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:683) 
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:390) 
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:197) 
Caused by: java.util.MissingResourceException: Can't find bundle for base name javax.servlet.LocalStrings, locale en_US 
    at java.util.ResourceBundle.throwMissingResourceException(ResourceBundle.java:1499) 
    at java.util.ResourceBundle.getBundleImpl(ResourceBundle.java:1322) 
    at java.util.ResourceBundle.getBundle(ResourceBundle.java:721) 
    at javax.servlet.ServletOutputStream.<clinit>(ServletOutputStream.java:87) 
    ... 25 more 
+0

testato il codice, proprio come hai fornito sopra, ma funziona per me, nessun errore. –

+0

puoi postare la tua configurazione pom – gyanu

+2

In pom: junit 4.7, javax.servlet-api 3.0.1, spring-test 4.0.3, spring-context 4.0.3 –

risposta

6

necessario sostituire dipendenza per JavaEE-api con javax .selvlet-api come di seguito:

<dependency> 
    <groupId>javax.servlet</groupId> 
    <artifactId>javax.servlet-api</artifactId> 
    <version>3.1.0</version> 
</dependency> 
+0

Quindi ho avuto lo stesso problema, tranne che avevo il j2ee-api 7 elencato come dipendenza (fornito). Pensavo che questo includesse l'API servlet, ma non appena ho aggiunto l'API servlet come sopra + a condizione che risolvesse il mio problema. Perché mai ha funzionato? – JoshC13

+0

sembra che j2ee-api contenga solo j2ee-api che può essere usato per la compilazione. Non contiene i corpi dei metodi, quindi non è utilizzabile per l'esecuzione o la distribuzione. per ulteriori http://www.mkyong.com/maven/how-to-download-j2ee-api-javaee-jar-from-maven/ – gyanu

+0

Giusto - e ho capito che il servlet-ap era semplicemente un set del j2ee-api più grande. Stai dicendo che questo non è il caso? – JoshC13

1

Secondo il Spring Framework Reference for Testing si dovrebbe essere utilizzando le annotazioni per i tuoi autowire prende in giro. L'esempio nel riferimento primavera:

`

@WebAppConfiguration 
    @ContextConfiguration 
    public class WacTests { 

    @Autowired WebApplicationContext wac; // cached 

    @Autowired MockServletContext servletContext; // cached 

    @Autowired MockHttpSession session; 

    @Autowired MockHttpServletRequest request; 

    @Autowired MockHttpServletResponse response; 

    @Autowired ServletWebRequest webRequest; 

    //... 
} 

`

Un esempio diverso (senza annotazioni) sono riportate here

0

Ho avuto un problema simile e risolto con l'aggiunta di questa dipendenza al mio pom e non c'è bisogno di cambiare il vostro JavaEE-API per javax.servlet

<dependency> 
<groupId>org.mortbay.jetty</groupId> 
<artifactId>servlet-api-2.5</artifactId> 
<version>6.1.11</version> 
</dependency> 
+0

In java possiamo trovare molte implementazioni di librerie in base al server su cui lavoriamo e nel tuo caso stai usando l'implementazione di jetty. Puoi anche verificare la presenza di glassfish, tomcat e altro ancora. – gyanu