Spring Web Flow

Kann es getestet werden?

Die obligatorische Frage nach einer Testmöglichkeit soll hier nicht ausbleiben. Spring Web Flow bietet mit der Klasse AbstractXmlFlowExecutionTests eine Basisklasse für Unittests, basierend auf JUnit, an. Prinzipiell wird von dieser Klasse bereits ein Großteil der Arbeit abgenommen, die notwendig ist, um eine Flowdefinition zu testen. Die Minimalvoraussetzung für eine Klasse, die von der besagten Klasse abgeleitet ist, ist die Implementierung der Methode getFlowDefinitionResource.

@Override
protected FlowDefinitionResource getFlowDefinitionResource() {
return createFlowDefinitionResource("/WEB-INF/flows/login-flow.xml");
}

Über diese Methode wird festgelegt, welche Flow-Definition getestet werden soll. In Listing 5 wird der Start des Flows geprüft. Die Klasse AbstractXmlFlowExecutionTests stellt dabei angepasste Versionen der von JUnit bekannten assertXXX-Methoden (z.B. assertCurrentStateEquals) zur Verfügung.

Listing 5
@Override
protected FlowDefinitionResource getFlowDefinitionResource() {
  return createFlowDefinitionResource("/WEB-INF/flows/login-flow.xml");
}

public void testStartFlow() {
  //start the flow
  ApplicationView selectedView = (ApplicationView) startFlow();
  assertNotNull(selectedView);
  assertCurrentStateEquals("enterLoginData");
  assertViewNameEquals("login", selectedView);
}

Für den Übergang in einen neuen Zustand steht die Methode signalEvent zur Verfügung. Diese Methode kann noch mit einer Map von Parametern versehen und damit die Formulareingabe simuliert werden (Listing 6).

Listing 6
public void testSubmitWithAdminTrue() {
  testStartFlow();
  MockParameterMap parameters = new MockParameterMap();
  parameters.put("name", "test");
  parameters.put("password", "test");
  parameters.put("admin", "true");
  //Send a signal
  ApplicationView selectedView = (ApplicationView) signalEvent("submit", parameters);
  assertNotNull(selectedView);
  assertCurrentStateEquals("displayAdmin");
  assertViewNameEquals("admin", selectedView);
}

Die Beispiele haben gezeigt, dass die Testunterstützung sehr gut gelungen ist. Es ist so mit einfachen Mitteln möglich, auch ohne ständiges Aufrufen im Browser gut getestete Flows zu erstellen. Die Verwendung dieser Möglichkeit sollte in jedem ernsthaften Projekt erwogen werden.

Die Zukunft von Spring Web Flow

Aktuell wird an der Version 2.0 von Spring Web Flow gearbeitet.

  • Flow Managed Persistence Contexts (mit JPA und Hibernate)
    Mit der Version 2 von Spring Web Flow wird Unterstützung von automatischer Persistenz mit JPA und Hibernate geboten. Bei der Erzeugung eines Flows steht automatisch ein EntityManager zur Verfügung. Die Persistenz von Entitäten innerhalb eines Flows erfolgt dabei nun mithilfe der standardisierten JPA (Java Persistence API)-Schnittstelle [5]. Dabei werden sämtliche Änderungen der Entitäten innerhalb eines Flows beim Beenden von diesem in der Datenbank persistiert.
  • Verbesserte Unterstützung von Java Server Faces (JSF)
    Die aktuell existierende Integration von Spring Web Flow mit JSF wird in das Spring Faces Modul ausgelagert. Durch Spring Faces wird der Community ein Extraprojekt für die Interaktion mit JSF zur Verfügung gestellt. Vor allem die Unterstützung von JSF wird in Spring Web Flow 2.0 ein wesentlicher Fokus sein, zumal JSF selbst keine gute Unterstützung für Flows bietet.
  • Unterstützung der Unified Expression Language (EL)
    In der aktuellen Version von Spring Web Flow wird OGNL [6] als Parser für die Ausdrücke verwendet. Mit der Version 2.0 wird nun, auch im Hinblick auf JSF, die Unified EL unterstützt.
    Ein erster Blick auf die neuen Features kann bereits jetzt mit der Version 2.0 M1 [7] gewagt werden.
Unterstützung für die Entwicklungsumgebung

Um die Übersicht über die definierten Flows nicht zu verlieren, kann die Spring IDE [7] für Eclipse eingesetzt werden. Diese kann ganz einfach über eine Update Site [8] installiert werden. Nach der Deklaration des Projekts als Spring-Projekt (Hinzufügen der „Spring Nature“) und dem Hinzufügen der gewünschten Flows für den Editor kann der Flow grafisch bearbeitet werden (Abb. 1).

Abb. 1: Der Spring Web Flow Editor der Spring IDE

Ob man nun direkt den grafischen Editor für das Erzeugen der Flows verwenden möchte, ist Geschmackssache – einige werden sicher die XML-Datei direkt editieren und auch hier hilft die Spring IDE zum Beispiel mit der Vervollständigung von Klassennamen. Die grafische Darstellung der Flows ist für die Dokumentation und die Kommunikation innerhalb des Entwicklerteams eine gelungene Hilfe.

Problem gelöst?

Mit Spring Web Flow wurde endlich ein Problem adressiert, welches in vielen Webanwendungen vorhanden ist, nämlich dass ein Geschäftsvorfall (UseCase) sich nicht nur auf eine Seite beschränkt, sondern auf mehrere. Aber besonders die Möglichkeit zur externen Beschreibung des Seitenflusses trägt zur Lesbarkeit der Anwendung bei. Auch wenn dadurch mehrere externe Konfigurationsdateien (die einzelnen Flow-Definitionen) hinzukommen, ist es in diesem Fall sicherlich tragbar, besonders weil die Konfiguration auch programmatisch in Java erzeugt werden könnte. Das Framework präsentiert sich nicht als eierlegende Wollmilchsau, sondern konzentriert sich auf den Flow. Es bietet Möglichkeiten zur Integration der meisten weit verbreiteten Webtechnologien und ergänzt Features, die dort oft schmerzlich vermisst werden. Besonders dadurch kann das Framework leichter in bereits vorhandene Anwendungsarchitekturen eingebracht werden. Dies macht den großen Charme des Frameworks aus. Insgesamt lohnt es sich sicherlich, einmal die mitgelieferten Beispiele der Spring-Web-Flow-Distribution auszuprobieren und diesem Framework eine Chance zu geben.

Markus Stäuble ist Senior Software Engineer bei namics (deutschland) GmbH, einem führenden IT- und Webdienstleister. Schwerpunkt in der täglichen Arbeit ist neben der Projektleitung die Architektur von Java-EE-Anwendungen und deren Qualitätssicherung. Darüber hinaus ist er freier Autor von Fachartikeln.
Kommentare

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht.