TomcatUnitProtocol ist eine Erweiterung des ServletUnitProtocol. TomcatUnitProtocol ist Bestandteil des Projekts Tomcat7 Testing, das aus dem Central Repository unter der Artifact-Id testing-tomcat7 bezogen werden kann.
Hintergrund#
Mit dem ServletUnitProtocol können keine JSPs verwendet werden, daher wurde das TomcatUnitProtocol geschaffen. Im Wesentlichen bringt es die dazu notwendigen Abhängigkeiten mit und registriert diese im Servlet-Container.Beispiel#
Systemweites Registrieren#
Durch folgenden Aufruf wird das TomcatUnitProtocol für alle URLs unter dem Protokoll "unit" verwendbar:TomcatUnitProtocol protocol = new TomcatUnitProtocol(); ProtocolFactory.register(protocol);
Es kann als unit://localhost/test.jsp verwendet werden.
Lokale Verwendung#
Das TomcatUnitProtocol kann auch lokal, beim Konstruieren eines URLs eingesetzt werden:TomcatUnitProtocol protocol = new TomcatUnitProtocol(); URL url = new URL(null, "unit://localhost/test.jsp", protocol); HttpURLConnection connection = (HttpURLConnection)url.openConnection(); int responseCode = connection.getResponseCode(); if (responseCode != 200) connection.getInputStream(); // throw String string = IOUtils.readString(connection.getInputStream());
Testen von JSF-Projekten#
Mit der Tomcat-Unit können auch JSF-Projekte getestet werden. In einem JUnit-Test kann der HtmlClient verwendet werden, um einen JSF-Container zu erzeugen:public class JsfTest { @Test public void test() throws Exception { HtmlClient client = new HtmlClient(); Page page = client.begin(new MutableURL("unit://localhost/faces/index.xhtml", getProtocol()), null, false); Assert.assertNotNull(page); Element head = page.getElement("//H1"); Assert.assertNotNull(head); Assert.assertEquals("Hello World!", head.getText()); } private ServletUnitProtocol getProtocol() { ServletUnitProtocol protocol = new TomcatUnitProtocol(); protocol.setWebXmlFile("src/test/webapp/WEB-INF/web.xml"); return protocol; } }
Damit JSF hochgefahren werden kann, ist JSF Workspace erforderlich. JSF Workspace ermöglicht, dass JSF-Komponenten im Workspace gefunden werden. Standardmäßig findet JSF nur Komponenten in JAR-Dateien.
Handelt es sich bei dem Projekt um ein Maven-Setup, können die POM-Dependencies etwa so aussehen:
<!-- Test scope --> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.11</version> <scope>test</scope> </dependency> <dependency> <groupId>com.intersult</groupId> <artifactId>html</artifactId> <version>1.1</version> <scope>test</scope> </dependency> <dependency> <groupId>com.intersult</groupId> <artifactId>testing-tomcat7</artifactId> <version>1.0</version> <scope>test</scope> </dependency> <dependency> <groupId>com.intersult</groupId> <artifactId>jsf-workspace</artifactId> <version>1.1</version> <scope>test</scope> </dependency>
Hinweis: Die Web-Root kann man dann unter src/test/webapp aufbauen. Damit befindet man sich Maven konform unter src/test und stört keine eventuell vorhandene Web-Root src/main/webapp.