Using Mortbays Jetty as embedded servlet container in unit tests
Von Carsten
Ich habe diesen Blogeintrag in einem Firmenblog veröffentlicht, daher ist er in Englisch. Und bitte:
Today I created a simple unit test that runs Mortbays Jetty as an embedded servlet container for a unit test with JUnit 4. It’s quite simple to run the ServletTester and add Servlets to it, so you can create HTTP requests and assert against the responses.
To run Jetty you need the following JAR files in your classpath:
- jetty-6.X.Y.jar
- jetty-servlet-tester-6.X.Y.jar
- jetty-util-6.X.Y.jar
- servlet-api-2.5-*.jar
The HelloServletTest simply sets up Jetty to initialize a servlet, runs one test and stops Jetty after it. The HelloServlet I used for the first test. It’s the obvious Hello World example.
Now you can remove HelloServlet
, add your own servlet classes and go unit test them. 😉
HelloServlet
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class HelloServlet extends HttpServlet {
@Override
public void doGet(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
PrintWriter out = resp.getWriter();
out.println("<h1>Hello, World!</h1>");
out.flush();
}
}
HelloServletTest
import static org.junit.Assert.*;
import java.util.Vector;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.mortbay.jetty.testing.HttpTester;
import org.mortbay.jetty.testing.ServletTester;
public class HelloServletTest {
private ServletTester tester;
@Before
public void setUp() throws Exception {
tester = new ServletTester();
tester.setContextPath("/context");
tester.addServlet(HelloServlet.class, "/hello/*");
tester.start();
}
@After
public void tearDown() throws Exception {
tester.stop();
}
@Test
public void testDefaultServlet() throws Exception {
HttpTester request = withRequest("/context/hello/info", null);
HttpTester response = new HttpTester();
response.parse(tester.getResponses(request.generate()));
assertNull(response.getMethod());
assertEquals(200, response.getStatus());
assertEquals("<h1>Hello, World!</h1>", response.getContent().trim());
}
private HttpTester withRequest(String path, Vector<String[]> parameters) {
String requestParameters = "";
for (String[] params : parameters) {
requestParameters += ("".equals(requestParameters) ? "?" : "&");
requestParameters += params[0] + "=" + params[1];
}
String uri = path;
if (requestParameters != "")
uri += requestParameters;
HttpTester request = new HttpTester();
request.setMethod("GET");
request.setHeader("Host", "127.0.0.1");
request.setURI(uri);
request.setVersion("HTTP/1.0");
return request;
}
}