02.11.2011

JavaEE 6 - Testing mit Hilfe des EJBContainers

Mit JavaEE 6 sind enige Neuerungen in die JavaEE Welt gekommen. Zum einen ist die Nutzung des Frameworks weiter vereinfacht worden und zum anderen wurden diverse Wünsche aus der Entwicklercommunity mit untergebracht.

In den meisten Fällen wurden die Konfigurations- möglichkeiten weiter vereinfacht und komplett auf Annotation umgestellt. Damit wurde die Linie bei der Entwicklung von J2EE 1.4 (schwergewichtig, stark XML lastig) zu Java EE 5 (POJOs, IoC, DI, Annotationen statt XML) konsequent weitergeführt.



Wesentliche Neuerungen sind:

  • Konfiguration von Servlets per Annotation (Servlet 3.0)
  • Integration von JSF 2.0 (ebenfalls Konfiguration per Annotation)
  • Wegfall der Interfaces für die Nutzung lokaler Beans
  • Singleton Scope für Beans (Annotation: @Singleton)
  • Erweiterung und Verbesserung der Timerfunktionalität
  • Unterstützung von asynchronen Methodenaufrufen in Session Beans
  • Integration von weiteren Mapping Optionen bei JPA 2.0
  • Bereitstellung eines EJBContainers für das Testen von EJB Anwendungen
Gerade der Wegfall der Interfaces ist ein wichtiger Punkt und kann kontrovers gesehen werden. Sicherlich ist somit eine Vereinfachung der Anwendung gegeben, aber gleichzeitig wird mit konkreten Implementierungen der Beans gearbeitet. Eine Entkopplung von Definition und konkreter Umsetzung fällt in diesem Fall unter den Tisch. Sicherlich ein Vorteil in unterschiedlichen Projekten, da der Overhead weiter dezimiert wird. Allerdings entscheidet man sich an dieser Stelle für die Nutzung der Implementierung innerhalb der weiteren Beans und somit gegen eine einfache Austauschbarkeit.

Ist kein Interface definiert, so stellt der Container ein Referenzobjekt zur Verfügung. Dieses Referenzobjekt beinhaltet alle öffentlichen Methoden der Bean selbst. Das Proxyobjekt ist eine von der ursprünglichen Bean abgeleitet Klasse und kann ganz normal in weiteren Beans genutzt werden. Diesen Umstand sollte der Entwickler unbedingt im Auge behalten.

Eine weitere spannende Neuerung ist der EJB Container (javax.ejb.embeddable.EJBContainer) , der für die Tests der entwickelten Beans bereit steht. Damit soll ein Test der erstellten Komponenten deutlich einfacher werden. Die Funktion ist an dieser Stelle reicht einfach zu erklären.

Der Container wird mit dem Aufruf EJBContainer.createEJBContainer() erstellt. Dabei werden alle EJBs die sich auf dem Classpath befinden als EJB im Container deployed und stehen in dem Test zur Verfügung. Dabei ist es egal, ob sich die EJBs verpackt in JAR Files befinden oder als Verzeichnis vorliegen. Sollte der Container nicht erfolgreich initialisiert werden können, wird eine EJBException geworfen.

Der Vorteil des Containers wird schnell an einem kleinen Beispiel klar. Als Basis dient eine kleine Anwendung, die die aktuellen Umrechnungskurse von der ECB bezieht, diese parst und einen einfachen Service für die Umrechnung von Euro in andere unterstützte Währungen bereithält.


Dabei spielt die Klasse EcbExchangeRateParser eine wichtige Rolle. Diese Klasse ist als Stateless Session Bean implementiert. Nach dem Erzeugen durch den Container werden die Daten der ECB abgerufen und mit Hilfe des EcbContentHandler geparst.


Mit Hilfe dieser Informationen werden später die Wechselkurse bestimmt, zu sehen in dem folgenden Snippet.


Diese Bean wird innerhalb des eigentlichen Währungsrechners für die Ermittlung des Wechselkurses genutzt.


Mit JavaEE 6 ist das durchführen von Integrationstests nun deutlich einfacher geworden. Die komplette Konfiguration und Nutzung von TestNG für einfache Tests entfällt als Beispiel. Dafür kann nun der bereits vorgestellte EJBContainer genutzt werden. Dieser wird in einer abstrakten Testklasse vor jedem Test erstellt und hochgefahren. Zusätzliche werden weitere Methoden bereitgestellt (Bean-Instanzen aus dem EJB-Kontext referenzieren und den Container nach den Tests ordnungsgemäß herunterfahren).


Beim Startup des Containers werden alle im Classpath befindlichen Beans geladen und deployed.

Bitte auf das Bild klicken um die Konsolenausgabe zu sehen
Dort sind dann auch die JNDI Namen für die Beans ersichtlich. Unter diesen JNDI Namen stehen die Beans für einen Lookup zur Verfügung.

Damit der Test funktioniert muss eine zusätzliche Dependency in die pom.xml eingetragen werden.


Diese Dependency sorgt für die Bereitstellung eines Embedded Glassfish der extra für das Testen entwickelt worden ist. Somit steht die gesamte Funktionalität des Glassfish innerhalb des Testcontainers zur Verfügung und ermöglicht ein einfaches implementieren der Tests.


Im Test selbst muss der Entwickler sich nicht mehr um DI oder die korrekte Instantiierung der Beans kümmern, da dies durch den EJBContainer abgewickelt wird.

Falls also wirklich die komplette Funktionalität zur Verfügung steht, ist dies sicherlich eine nette Alternative zu gängigen Frameworks.

Das Beispiel findet sich wie immer in meinem Repository unter https://svn-saschadoemer.forge.cloudbees.com/saschadoemerblogspotcom/EJB

Keine Kommentare:

Kommentar veröffentlichen