Das ServletUnitProtocol ist ein Protocol zum direkten Aufruf von Web-Applikationen. ServletUnitProtocol ist Bestandteil von Intersult Testing und für die ProtocolFactory geeignet. Falls eine Browser-Simulation eingesetzt werden soll, kann HtmlClient verwendet werden.
Damit können WAR-Projekte direkt getestet werden, ohne über das TCP/IP-System zu gehen. Es wird eine direkte Stream-Verbindung (java.io) zwischen dem Aufrufer und dem Servlet hergestellt. Die Server-Komponenten können dabei direkt über die web.xml definiert werden, sodass ein WAR-Projekt direkt aufgerufen werden kann.
Das ServletUnitProtocol kann für die Konfiguration von anderen Komponenten verwendet werden, wie zum Beispiel Abraxas.
Parameter | Bedeutung |
---|---|
webXmlFile | Der Pfad an dem sich die web.xml-Datei befindet, Standard ist "src/main/webapp/WEB-INF/web.xml". Bei einer gefilterten Web-Application (Variablenersetzung), kann auch target/<finalname>/WEB-INF/web.xml verwendet werden. |
contextPath | Der Kontext-Pfad der laufenden Web-Anwendung, also http://localhost/<contextPath>/..." Standard ist "/". |
translateProtocol | Standard ist, dass die Web-Anwendung im Aufruf-URL als Protocol einen URL mit "unit://localhost/..." übergeben bekommt. Meist ist dies nützlich, da die Links auf Web-Seiten so auch wieder auf das Protocol verweisen. Einige Anwendungen können damit Probleme haben, daher kann dieses Verhalten durch den Wert false abgeschaltet werden. In diesem Fall wird die URL zu "http://localhost/..." übersetzt. |
String message = "Hello World!"; URL url = new URL("unit://localhost/echo"); ServletUnitConnection connection = (ServletUnitConnection)url.openConnection(); connection.setDoOutput(true); connection.addRequestProperty("Content-Type", "text/plain"); IOUtils.write(connection.getOutputStream(), message); String response = IOUtils.readString(connection.getInputStream()); Assert.assertEquals(message, response);
Und in der web.xml:
<servlet> <servlet-name>EchoServlet</servlet-name> <servlet-class>com.intersult.testing.EchoServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>EchoServlet</servlet-name> <url-pattern>/echo</url-pattern> </servlet-mapping>
Zunächst wird das Output-Directory in das Build-Verzeichnis gelegt, sodass das exploded WAR-Verzeichnis komplett ist:
<build> <finalName>name</finalName> <outputDirectory>${project.build.directory}/${project.build.finalName}/WEB-INF/classes</outputDirectory> ... </build>
Der Test kann dann so aussehen:
public class ITCheck { @BeforeClass public static void beforeClass() { ServletUnitProtocol protocol = new ServletUnitProtocol("/name"); protocol.setWebXmlFile("target/name/WEB-INF/web.xml"); ProtocolFactory.register(protocol); } @Test public void test() throws Exception { HtmlClient client = new HtmlClient(new UrlClient()); URL url = new URL("unit://localhost/"); Page page = client.begin(url, null, false); Element error = page.getElement("/HTML/BODY/H2[1]"); Assert.assertNull(error); } }
Erklärung: Die statische Methode beforeClass registriert das ServletUnitProtocol. Die Methode test erzeugt einen neuen HtmlClient, der einen GET-Request auf die URL unit://localhost/ absetzt. Die erzeugte HTML-Seite wird geparsed und als Page-Objekt zurückgegeben. Danach wird getestet, dass sich auf der Seite kein Element mit dem Xpath "/HTML/BODY/H2[1]" befindet.
Die Simulation eines Browsers kann dann mit einem HtmlClient erfolgen, der systemkonform über die URLConnection geht. Dadurch sind Server- und Client völlig entkoppelt, können daher beliebig simuliert und getestet werden.
Antwort: Es wurde versucht JSPs zu rendern, das kann mit TomcatUnitProtocol durchgeführt werden.