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
Author by
gyanu
Updated on June 17, 2022Comments
-
gyanu almost 2 years
I was trying to write unit test for Servlet using sprint-test using mock object
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