[TomcatUnitProtocol] ist eine Erweiterung des [ServletUnitProtocol]. [TomcatUnitProtocol] ist Bestandteil des Projekts Tomcat7 Testing, das aus dem [Central Repository|http://search.maven.org/] 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|JSF] 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.