If you’d like to test your web application you might be interested in Jetty: you can deploy your servlets in it, generate HTTP requests and check if certain criteria are met – everything inside a JUnit test.
Jetty has got enough documentation to get you started; if you want more you can get support from the creators of Jetty. This post was inspired by this particular page from the docs. I setup a very small Eclipse project that can be downloaded as tar.gz or zip; alternatively, you can browse the code here.
JUnit scaffolding
Lets have a look at a small JUnit class, that implements a setUp
method to bootstrap Jetty:
import org.junit.Before; import org.mortbay.jetty.testing.HttpTester; import org.mortbay.jetty.testing.ServletTester; public class WebAppTest { private ServletTester tester; private HttpTester request; private HttpTester response; @Before public void setUp() throws Exception { this.tester = new ServletTester(); this.tester.setContextPath("/"); this.tester.addServlet(MyServlet.class, "/"); this.tester.start(); this.request = new HttpTester(); this.response = new HttpTester(); this.request.setMethod("GET"); this.request.setHeader("Host", "tester"); this.request.setVersion("HTTP/1.0"); } |
This method leverages the features provided by the ServletTester
class, which will create a Jetty server for us. Instead of writing a web.xml
, we can add servlets to the server programmatically. After that we start the server and create a request/response pair that can be used in the test methods.
Testing
Now you can write several test methods for every request you’d like to check. If you want to check the start page of your web application you set the URI, generate a request, send it to Jetty, receive the response and check it like so:
@Test public void testHomepage() throws Exception { this.request.setURI("/"); this.response.parse(tester.getResponses(request.generate())); assertTrue(this.response.getMethod() == null); assertEquals(200, this.response.getStatus()); assertEquals("Hello World", this.response.getContent()); } |
In this simple case the MyServlet
class contains a line like this:
response.getWriter().append("Hello World"); |
Conclusion
Jetty is said to be highly embeddable. As far as I’ve checked it out, that’s absolutely true. Due to this it’s very easy to use Jetty inside unit tests. I haven’t tried to use Jetty with web frameworks but that should be no problem either. So if you’d like to test your servlets I recommend checking out Jetty.
Pingback: Webservices with Hessian and Burlap
Yes – its a common usage for jetty. Include it in your unittest here.
Hi Christian,
thanks for the link, it’s a nice reference for what I’ve presented in this post.
When not moving the mouse the Jetty unit tests take about a minute to start Jetty. Not good for automated scripts. Any idea how to work around this?
Hi Steve,
I haven’t had this problem so far and unfortunately, I haven’t found a way via Google to work around this.