2014-04-30 12 views
5
  1. starałem się napisać badanej jednostki dla serwletu przy użyciu sprint test używając atrapa obiektuBłąd podczas tworzenia obiektu MockHttpServletResponse dla testów jednostkowych

  2. moje uzależnienie maven jest:

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

Chcę przetestować tylko servlet java jak poniżej po książce PRAKTYCZNE TDD I AKCEPTACJA 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; 
    } 

} 

Mój kod to:

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

} 

mam błąd na linii odpowiedzi MockHttpServletResponse = new MockHttpServletResponse(); następująco:

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

Testowany kod, tak jak podałeś go powyżej, ale działa dla mnie bez błędów. –

+0

Czy możesz zamieścić swoją konfigurację pom? – gyanu

+2

W pom: junit 4.7, javax.servlet-api 3.0.1, wiosenny test 4.0.3, wiosna-kontekst 4.0.3 –

Odpowiedz

6

trzeba wymienić zależność dla JavaEE-API z javax .selvlet-api jak poniżej:

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

Tak więc miałem ten sam problem, z wyjątkiem tego, że miałem j2ee-api 7 jako zależność (dostarczoną). Pomyślałem, że to zawiera aplet apletu, ale jak tylko dodałem aplet apletu jak wyżej + pod warunkiem, że to rozwiązało mój problem. Po co ta robota? – JoshC13

+0

wydaje się, że j2ee-api zawiera tylko j2ee-api, niż można użyć do kompilacji. Nie zawiera treści metod, więc nie można ich użyć do uruchomienia lub wdrożenia. więcej http://www.mkyong.com/maven/how-to-download-j2ee-api-javaee-jar-from-maven/ – gyanu

+0

Dobrze - i zrozumiałem, że aplet-api był po prostu podrzędnym zestaw większego j2ee-api. Mówisz, że tak nie jest? – JoshC13

1

Według Spring Framework Reference for Testing powinno być za pomocą adnotacji do autowire swoje mocks. W przykładzie w odniesieniu sprężyny:

`

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

    //... 
} 

`

inny przykład (bez opisów) można znaleźć here

0

Miałem podobny problem i rozwiązać go dodając tę ​​zależność do mojego pom i nie ma potrzeby, aby zmienić JavaEE-API do javax.servlet

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

W java możemy znaleźć wiele implementacji bibliotek zgodnie z serwerem, na którym pracujemy, aw twoim przypadku korzystasz z implementacji jetty. Możesz również sprawdzić glassfish, tomcat, a także więcej. – gyanu

Powiązane problemy