TomcatUnitProtocol

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.