Enterprise JavaBeans Überblick 1. Überblick Java EE 5 und Komponententechnologien 2. Einführung Java EE 5 Plattform 3. Enterprise JavaBeans Architektur 4. Ressourcen Management und Primäre Services 5. Java Persistence: Entity Manager 6. Objekt-Relationales Mapping 7. Entity Bean Beziehungen 9. Architektur der Web-Schicht, JavaServer Faces mit JBoss / Eclipse 10. Queries 11. Value Objects 12. Session Facade 13. Transaktionen und Concurrency 14. Ergänzungen zu EJBs 15. UML Modellierung und EJBs 16. Session Beans 17. JavaServer Faces Prof. Dr. Björn Dreher Liste V Enterprise JavaBeans 332 Enterprise JavaBeans Überblick: 8.1 Einleitung 8.3 Anwendung mit Eclipse und dem JBoss Application Server Prof. Dr. Björn Dreher Liste V Enterprise JavaBeans 333 1
8.1 Einleitung Bestandteil der iterativen und agilen XP-Methode Schreiben Sie den Test zuerst! Zuerst Testcode schreiben Erst dann die Klasse, die getestet werden soll Ergebnis: Entwickler schreibt Unit Testing Code für fast den gesamten Produktionscode Rhythmus: Ein wenig Testcode Ein wenig Produktionscode Dieser muss Test bestehen Dann kommt der nächste Testcode Prof. Dr. Björn Dreher Liste V Enterprise JavaBeans 334 8.1 Einleitung Vorteile Unit Tests werden wirklich geschrieben Zufriedenheit des Programmierers Kann ich den Code so schreiben, dass er diesen Test besteht? Interface und Verhalten werden im Detail geklärt Hauptvorteil Man muss sich Code vorstellen Alle Einzelheiten der öffentlichen Sicht des Codes Name, Parameter, Rückgabewert, Verhalten Beweisbare, wiederholbare, automatisierte Verifizierung Testbasis wächst ständig (10, 50, 500, Tests) Leichte Verifizierung der Korrektheit Läuft automatisch ab Prof. Dr. Björn Dreher Liste V Enterprise JavaBeans 335 2
8.1 Einleitung Vorteile (fortgesetzt) Vertrauen, Dinge ändern zu können Bei Änderungen kann man ganz leicht testen, ob die bisherigen Tests immer noch bestanden werden Unit Testing Frameworks xunit-familie (www.junit.org) JUnit (Kent Beck, Erich Gamma): Java Versionen 3 (bis Java 1.4.x) und 4 (ab Java 5 mit Annotationen) NUnit:.NET (managed code) CppUnit: C++ (Visual C++, MFC) Prof. Dr. Björn Dreher Liste V Enterprise JavaBeans 336 Enterprise JavaBeans Überblick: 8.1 Einleitung 8.3 Anwendung mit Eclipse und dem JBoss Application Server Prof. Dr. Björn Dreher Liste V Enterprise JavaBeans 337 3
Ablauf eines Tests Das Ding, das getestet werden soll, erstellen Heißt manchmal fixture, etwa: Testobjekt Bei uns ist es eine Session Bean der EJB Schicht Über LookUp erreichbar Etwas mit ihm tun also einige seiner Methoden aufrufen, die getestet werden sollen Prüfen, ob die Ergebnisse den Erwartungen entsprechen Prof. Dr. Björn Dreher Liste V Enterprise JavaBeans 338 Testklasse Bestandteil eines weiteren Application Clients Von Eclipse als Template erstellbar Verwendet Package org.junit Template implementiert schon verschiedene Unit Testing Verhaltensweisen Eine oder mehrere Testmethoden pro zu testender public Methode der Session Bean Ausnahmen: Triviale Methoden, z.b. setter und getter Gekennzeichnet durch Annotation: @Test Werden alle automatisch ausgeführt Prof. Dr. Björn Dreher Liste V Enterprise JavaBeans 339 4
Beispiel: Customer Projekt package com.titan.test; import java.util.collection; import java.util.list; import javax.naming.context; import javax.rmi.portableremoteobject; import org.junit.* import com.titan.customer.customer; import com.titan.customer.phone; import com.titan.session.sessionfacaderemote; public class TestCase { private static SessionFacadeRemote session = null; Definition eines Test-Cases Konstruktor; Weitergabe an Vorfahren Prof. Dr. Björn Dreher Liste V Enterprise JavaBeans 340 Beispiel: Customer Projekt (fortgesetzt) @BeforeClass public static void setupbeforeclass() throws Exception { // Get reference to session bean Properties props = new Properties(); Einmal vor allen Tests /* Das folgende brauchen wir, wenn die JBoss Security aktiviert ist props.setproperty(context.security_principal, "admin"); props.setproperty(context.security_credentials, "admin"); props.setproperty(context.initial_context_factory, "org.jboss.security.jndi.jndilogininitialcontextfactory"); */ // Diese Property gilt nur bei nicht aktivierter JBoss Security props.setproperty(context.initial_context_factory, "org.jnp.interfaces.namingcontextfactory"); // Diese Properties gelten immer props.setproperty(context.url_pkg_prefixes, "org.jboss.naming.client"); props.setproperty(context.provider_url, "jnp://localhost:1099"); props.setproperty("j2ee.clientname", "CustomerTestClient"); Prof. Dr. Björn Dreher Liste V Enterprise JavaBeans 341 5
Beispiel: Customer Projekt (fortgesetzt) try { Context ctx = new InitialContext(props); session = (SessionFacadeRemote) ctx.lookup("sessionfacadebean"); catch (Exception ex) { System.out.println("Exception bei LookUp"); ex.printstacktrace(); Facade nur einmal holen // Lösche alle existierenden Kunden (ggf. kaskadierend) List<Customer> liste = session.getallcustomers(); System.out.println("Wir löschen jetzt " + liste.size() + " Kunden!"); for (Customer customer : liste) { session.deletecustomer(customer.getid()); Ausgangszustand Prof. Dr. Björn Dreher Liste V Enterprise JavaBeans 342 Aufräumen nach allen Tests @AfterClass public static void teardownafterclass() throws Exception { Beispiel: Customer Projekt (fortgesetzt) @Before public void setup() throws Exception { @After public void teardown() throws Exception { Vor jedem einzelnen Test Nach jedem einzelnen Test Prof. Dr. Björn Dreher Liste V Enterprise JavaBeans 343 6
Beispiel: Customer Projekt (fortgesetzt) @Test Testmethode public void testsinglephoneexchange() { Customer cust1 = new Customer("Meier", "Hans", true); Customer cust2 = new Customer("Müller", "Kurt", true); Long id1 = session.createcustomer(cust1); Long id2 = session.createcustomer(cust2); Phone phone1 = new Phone("101", (byte)1); Phone phone2 = new Phone("102", (byte)2); Phone phone3 = new Phone("203", (byte)1); session.newcustomerphone(id1, phone1); session.newcustomerphone(id1, phone2); Erstelle ein paar Entities session.newcustomerphone(id2, phone3); Prof. Dr. Björn Dreher Liste V Enterprise JavaBeans 344 Beispiel: Customer Projekt (fortgesetzt) session.changecustomerphone(id1, id2, (byte)2); Zu testende Methode asserttrue("customer 1 sollte jetzt nur noch 1 Phone haben", session.getcustomer(id1).getphonenumbers().size() == 1); asserttrue("customer 2 sollte jetzt genau 2 Phones haben", session.getcustomer(id2).getphonenumbers().size() == 2); Prüfung auf Korrektheit Prof. Dr. Björn Dreher Liste V Enterprise JavaBeans 345 7
Enterprise JavaBeans Überblick: 8.1 Einleitung 8.3 Anwendung mit Eclipse und dem JBoss Application Server Prof. Dr. Björn Dreher Liste V Enterprise JavaBeans 346 Vorbereitung Einen neuen (Test-) Application Client anlegen und in das EAR Projekt aufnehmen Keine Main Klasse erzeugen lassen Deployment-Deskriptor erzeugen lassen Prof. Dr. Björn Dreher Liste V Enterprise JavaBeans 347 8
Test Application Client In den Properties unter J2EE Module Dependencies die Abhängigkeit zu dem EJB Projekt definieren Prof. Dr. Björn Dreher Liste V Enterprise JavaBeans 348 Test Application Client Als Projekt-Referenz ebenfalls das EJB-Projekt aufnehmen: Prof. Dr. Björn Dreher Liste V Enterprise JavaBeans 349 9
Erstellen des Test Cases In dem Test Application Client mit New aus der Rubrik Java einen JUnit Test Case erzeugen Prof. Dr. Björn Dreher Liste V Enterprise JavaBeans 350 Erstellen des Test Cases Wählen: New JUnit 4 test Package-Name Methodenrümpfe Finish drücken Prof. Dr. Björn Dreher Liste V Enterprise JavaBeans 351 10
Bibliothek einbinden Auf Nachfrage dem Projekt die korrekte Bibliothek zuordnen lassen OK drücken Dann: Testmethoden hinzufügen, wie oben gesehen Prof. Dr. Björn Dreher Liste V Enterprise JavaBeans 352 Test vorbereiten Neues Projekt dem Server zuordnen sollte automatisch als Unterprojekt geschehen sein Den Server starten Deployen (Publish) Test starten Im Kontextmenü des Test Client Application Projektes über Run as JUnit Test starten Prof. Dr. Björn Dreher Liste V Enterprise JavaBeans 353 11
Test ausführen Ausgabe Tab JUnit öffnen Die Tests sind o.k. Prof. Dr. Björn Dreher Liste V Enterprise JavaBeans 354 12