I had the same requirement that you and I found a way to make it work. I was looking for the source code for Spark, and I found two useful classes:
- SparkTestUtil : this class wraps Apache HttpClient and provides methods for creating different HTTP requests on the local web server (runs on the local host) with a custom port (in the constructor) and relative path (in the request methods)
- ServletTest : it runs a Jetty instance in the local port with the application context and relative path of the directory where WEB-INF / You can find the file descriptor web.xml. This web.xml will be used to simulate a web application. He then uses SparkTestUtil to make http requests against this simulated application and validate the results.
This is what I did: I created a junit test class that implements the SparkApplication interface. In this interface, I create and initialize a “controller” (my application class) that is responsible for responding to HTTP requests. In a method annotated with @BeforeClass, I initialize a Jetty instance using web.xml, which references the junit test class as SparkApplication and SparkTestUtil
JUnit Testing Class
package com.test import org.eclipse.jetty.server.Connector; import org.eclipse.jetty.server.Server; import org.eclipse.jetty.server.ServerConnector; import org.eclipse.jetty.webapp.WebAppContext; public class ControllerTest implements SparkApplication { private static SparkTestUtil sparkTestUtil; private static Server webServer; @Override public void init() { new Controller(...) } @BeforeClass public static void beforeClass() throws Exception { sparkTestUtil = new SparkTestUtil(PORT); webServer = new Server(); ServerConnector connector = new ServerConnector(webServer); connector.setPort(PORT); webServer.setConnectors(new Connector[] {connector}); WebAppContext bb = new WebAppContext(); bb.setServer(webServer); bb.setContextPath("/"); bb.setWar("src/test/webapp/"); webServer.setHandler(bb); webServer.start(); (...) } @AfterClass public static void afterClass() throws Exception { webServer.stop(); (...) } }
src / test / webapp / WEB-INF / web.xml file
<!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" "http://java.sun.com/dtd/web-app_2_3.dtd" > <web-app> <display-name>Archetype Created Web Application</display-name> <filter> <filter-name>SparkFilter</filter-name> <filter-class>spark.servlet.SparkFilter</filter-class> <init-param> <param-name>applicationClass</param-name> <param-value>com.test.ControllerTest</param-value> </init-param> </filter> <filter-mapping> <filter-name>SparkFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> </web-app>
It can be improved, but it is a good starting point, I think. Maybe some kind of “intrinsic safety” component could be created?
Hope this would be helpful for you!
ferwasy
source share