[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.