Error creating object MockHttpServletResponse for unit testing

12,657

Solution 1

I need to replace dependency for javaee-api with javax.selvlet-api as below:

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

Solution 2

According to the Spring Framework Reference for Testing you should be using annotations to autowire your mocks. The example in the spring reference:

`

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

    //...
}

`

A different example (without annotations) can be found here

Share:
12,657
gyanu
Author by

gyanu

Updated on June 17, 2022

Comments

  • gyanu
    gyanu almost 2 years
    1. I was trying to write unit test for Servlet using sprint-test using mock object

    2. my maven dependency is:

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

    I want to test just java servlet like below following book PRACTICAL TDD AND ACCEPTANCE TDD FOR 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;
        }
    
    }
    

    My code is:

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

    I got error on line MockHttpServletResponse response = new MockHttpServletResponse(); as follows:

    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