At line 6 changed 1 line. |
This tutorial will show you how to create a Business Facade class (and a JUnit Test) to talk to the [DAO we created in Part I|CreateDAO]. |
Dieses Tutorial erklärt, wie mann eine Business Facade Klasse (Und den dazugehörigen JUnit Test) erzeugt, um mit der DAO Schicht zu kommunizieren, die wir in [Teil I|CreateDAO_de] erzeugt haben. |
At line 8 changed 1 line. |
In the context of [AppFuse], this is called a Manager class. Its main responsibility is to act as a bridge between the persistence (DAO) layer and the web layer. It's also useful for de-coupling your presentation layer from your database layer (i.e. for Swing apps). Managers should also be where you put any business logic for your application. |
Im Kontext von [AppFuse] wird diese Klasse Manager Klasse genannt. Die hauptsächliche Aufgabe der Klasse besteht darin, die Verbindung zwischen WebLayer und DAO Schicht zu bilden. Sie unterstützt einen auch dabei, die Präsentationsschicht von der Datenbankschicht zu trennen (z.B. für Swing Anwendungen). Businesslogik der Anwendung sollte in die Manager gelegt werden. |
At line 10 changed 1 line. |
;:%%(color: blue)''I will tell you how I do stuff in the __Real World__ in text like this.''%% |
;:%%(color: blue)''In dieser Textformatierung erläutere ich, wie man Dinge in der __echten Welt__ durchführt.''%% |
At line 12 changed 1 line. |
Let's get started by creating a new ManagerTest and Manager in AppFuse's architecture. |
Beginnen wir mit dem Erstellen eines neuen Manager Tests und der Manager in der Architektur von AppFuse. |
At line 14 changed 5 lines. |
!Table of Contents |
* [1] Create a new ManagerTest to run JUnit tests on the Manager |
* [2] Create a new Manager to talk to the DAO |
* [3] Configure Spring for this Manager and Transactions |
* [4] Run the ManagerTest |
!Inhaltsverzeichnis |
* [1] Einen neuen Manager Test erstellen, um JUnit Tests auf dem Manager auszuführen |
* [2] Einen neuen Manager erstellen, um mit der DAO Schicht zu kommunizieren |
* [3] Spring für diesen Manager und die Transaktionen konfigurieren |
* [4] Den Manager Test ausführen |
At line 20 changed 2 lines. |
!!Create a new ManagerTest to run JUnit tests on the Manager [#1] |
In [Part I|CreateDAO], we created a Person object and PersonDao - so let's continue developing this entity. First, let's create a JUnit test for the PersonManager. Create PersonManagerTest in the test/service/**/service directory. We'll want to test the same basic methods (get, save, remove) that our DAO has. |
!!Einen neuen Manager Test erstellen, um JUnit Tests auf dem Manager auszuführen [#1] |
At line 23 changed 1 line. |
;:''This may seem redundant (why all the tests!), but these tests are GREAT to have 6 months down the road.'' |
Im [Teil I|CreateDAO_de] haben wir ein Person Objekt und eine PersonDao erzeugt - also entwickeln wir weiter an dieser Einheit. Zuerst sollten wir einen JUnit Test für den PersonManager erzeugen. Man erzeugt den PersonManagerTest in dem Verzeichnis test/service/**/service. Wir wollen die selben grundlegenden Methoden (get, save, remove) testen, die auch in unserer DAO vorkommen. |
At line 25 changed 1 line. |
This class should extend [BaseManagerTestCase|http://raibledesigns.com/downloads/appfuse/api/org/appfuse/service/BaseManagerTestCase.java.html], which already exists in the ''service'' package. The parent class (BaseManagerTestCase) serves similar functionality as the BaseDaoTestCase. |
;:''Das mag einem redundant vorkommen (Warum diese ganzen Tests!), aber diese Test sind fantastisch, wenn man nur noch 6 Monate bis zum Ende des Projekts vor sich hat.'' |
At line 27 changed 1 line. |
;:%%(color: blue)''I usually copy (open → save as) an existing test (i.e. UserManagerTest.java) and find/replace [[Uu]ser with [[Pp]erson, or whatever the name of my object is.''%% |
Diese Klasse sollte von der Klasse [BaseManagerTestCase|http://raibledesigns.com/downloads/appfuse/api/org/appfuse/service/BaseManagerTestCase.java.html] abgeleitet werden, die bereits im ''service'' Package vorliegt. Diese Klasse (BaseManagerTestCase) stellt ähnliche Funktionen bereit wie die Klasse BaseDaoTestCase. |
At line 29 changed 1 line. |
The code below is what you need for a basic JUnit test of your Manager. Unlike the DaoTest, this test uses [jMock|http://jmock.org] to isolate the Manager from its dependencies and make it a ''true'' "unit" test. This can be very helpful because it allows you to test your business logic w/o worrying about other dependencies. The code below simply sets up the Manger and its dependencies (as Mocks) for testing. |
;:%%(color: blue)''Normalerweise öffne (open → save as) ich einen bereits existierenden Test (z.B. UserManagerTest.java) und suche/ersetze [[Uu]ser mit [[Pp]erson, oder wie auch immer der Name des Objekts lautet.''%% |
At line 30 added 2 lines. |
Der untenstehende Code ist das einzige, was man für einen einfachen JUnit Test für den Manager benötigt. Anders als der DaoTest nutzt dieser Test [jMock|http://jmock.org], um den Manager von seinen Abhängigkeiten zu befreien und ihn so zu einem ''echten'' "Unit" Test zu machen. Dies kann sehr hilfreich sein, da es einem erlaubt, Business Logik zu testen, ohne sich Sorgen um andere Abhängigkeiten zu machen. Der untenstehende Code erzeugt für die Tests einfach den Manager und seine Abhängigkeiten (als Mocks). |
|
At line 64 changed 1 line. |
Now that you have the skeleton done for this class, you need to add the meat: the test methods to make sure everything works. Here's a snippet from the [DAO Tutorial|CreateDAO] tutorial to help you understand what we're about to do. |
Nachdem wir jetzt das Gerüst für diese Klasse erzeugt haben, müssen wir ihn noch mit Inhalt befüllen: Die Testmethoden, die sicherstellen, dass alles funktioniert. Hier ist ein Ausschnitt aus dem [DAO Tutorial|CreateDAO_de], um einfacher zu verstehen, was wir gleich machen werden. |
At line 66 changed 1 line. |
;:''...we create methods that begin with "test" (all lower case). As long as these methods are public, have a void return type and take no arguments, they will be called by our <junit> task in our Ant build.xml file. Here's some simple tests for testing CRUD. An important thing to remember is that each method (also known as a test), should be autonomous.'' |
;:''... Um dies zu tun erzeugen wir Methoden, die mit "test" (alles klein geschrieben) beginnen. Solange diese Methoden öffentlich sind, müssen sie als Rückgabewert "void" besitzten und keine Argumente besitzen. Sie werden von unserem <junit> task in unserer Ant build.xml Datei aufgerufen. Hier sind ein paar einfache Test um die CRUD Methoden zu überprüfen. Wichtig dabei ist es im Hinterkopf zu behalten, dass jede einzelne dieser Methoden (auch als "Test" bekannt) autonom sein sollte.'' |
At line 68 changed 1 line. |
Add the following methods to your PersonManagerTest.java file: |
Jetzt fügt man folgende Methoden zur Datei PersonManagerTest.java hinzu: |
At line 73 changed 1 line. |
// set expected behavior on dao |
// set expected behavior on dao |
//Das erwartete Verhalten fuer die DAO definieren |
At line 85 added 1 line. |
//Das erwartete Verhalten fuer die DAO definieren |
At line 97 added 1 line. |
//Benoetigte Felder stetzen |
At line 102 added 1 line. |
//Das erwartete Verhalten fuer die DAO definieren |
At line 109 added 1 line. |
//Erwartungen zurücksetzen |
At line 117 added 1 line. |
//Erwartungen zurücksetzen |
At line 120 added 1 line. |
//Entfernen |
At line 129 added 2 lines. |
|
|
At line 127 changed 1 line. |
This class won't compile at this point because we have not created our PersonManager interface. |
Zur Zeit wird diese Klasse noch nicht kompilieren, weil wir das Interface PersonManager noch nicht erzeugt haben. |
At line 129 changed 1 line. |
;:%%(color: blue)''I think it's funny how I've followed so many patterns to allow __extendibility__ in AppFuse. In reality, on most projects I've been on - I learn so much in a year that I don't want to extend the architecture - I want to rewrite it. Hopefully by keeping AppFuse up to date with my perceived best practices, this won't happen as much. Each year will just be an upgrade to the latest AppFuse, rather than a re-write. ;-)'' |
;:%%(color: blue)''Ich glaube, dass es sehr witzig ist, wie ich verschiedene Patterns angewendet habe, um __Erweiterbarkeit__ in AppFuse zu ermöglichen. In Wirklichkeit habe ich in den meisten meiner Projekte so viel in einem Jahr gelernt, dass ich die Architektur nicht erweitern will, ich will sie umschreiben. Ich hoffe dass das nicht zu oft passieren wird, indem ich AppFuse mit den meiner Meinung nach besten Lösungen auf dem neuesten Stand halte. Jedes Jahr wird es nur ein Upgrade für AppFuse geben, anstatt Appfuse umzuschreiben. ;-)'' |
At line 131 changed 1 line. |
!!Create a new Manager to talk to the DAO [#2] |
!!Einen neuen Manager erstellen, um mit der DAO Schicht zu kommunizieren [#2] |
At line 133 changed 1 line. |
First off, create a PersonManager.java interface in the src/service/**/service directory and specify the basic CRUD methods for any implementation classes. ''I've eliminated the JavaDocs in the class below for display purposes.'' The ''setPersonDao()'' method is not used in most cases - its just exists so the PersonManagerTest can set the DAO on the interface. |
Zu aller erst erzeugt man ein Interface mit dem Namen PersonManager.java im Verzeichnis src/service/**/service und definiert die grundlegenden CRUD Methoden für alle implementierenden Klassen. ''Ich habe die JavaDocs in den Klassen entfernt, um die Darstellung zu verbessern.'' Die ''setPersonDao()'' Methode wird in den meisten Fällen nicht genutzt. - Sie existiert nur, damit der PersonManagerTest die DAO über das Interface setzen kann.. |
At line 135 changed 1 line. |
;:%%(color: blue)''As usual, I usually duplicate (open → save as) an existing file (i.e. UserManager.java).''%% |
;:%%(color: blue)''Wie üblich, dupliziere (open → save as) ich eine bereits existierende Datei (z.B. UserManager.java).''%% |
At line 152 changed 1 line. |
Now let's create a PersonManagerImpl class that implements the methods in PersonManager. To do this, create a new class in src/service/**/service/impl and name it PersonManagerImpl.java. It should extend BaseManager and implement PersonManager. |
Jetzt erzeugt wir eine PersonManagerImpl Klasse, die die Methoden des PersonManager Interfaces implementiert. Um dies zu tun, erzeugt man eine neue Klasse im Verzeichnis src/service/**/service/impl und nennt diese PersonManagerImpl.java. Diese sollte von der Klasse BaseManager abgeleitet sein und das Interface PersonManager implementieren. |
At line 183 changed 1 line. |
One thing to note is the {{setPersonDao()}} method. This is used by Spring to bind the PersonDao to this Manager. This is configured in the applicationContext-service.xml file. We'll get to configuring that in Step 3[3]. You should be able to compile everything now using "ant compile-service". |
Eine Sache, auf die hingewiesen werden muss, ist die {{setPersonDao()}} Methode. Diese Methode wird von Spring genutzt, um die PersonDao an diesen Manager zu binden. Dies wird in der Datei applicationContext-service.xml konfiguriert. Zu diesem Punkt werden wir in Schritt 3[3] kommen. Jetzt sollte es möglich sein, alles mit der Hilfe von "ant compile-service" zu kompilieren. |
At line 185 changed 1 line. |
Now you need to edit Spring's config file for our services layer so it will know about this new Manager. |
Jetzt muss man die Konfigurationsdatei von Spring editieren, damit unsere Service Schicht diesen neuen Manager kennt. |
At line 187 changed 1 line. |
!!Configure Spring for this Manager and Transactions [#3] |
!!Spring für diesen Manager und die Transaktionen konfigurieren [#3] |
At line 189 changed 1 line. |
To notify Spring of this our PersonManager interface and its implementation, open the src/service/**/service/applicationContext-service.xml file. In here, you should see a commented out definition for the "personManager" bean. Uncomment this, or add the following to the bottom of this file. |
Um unser PersonManager Interface und die dazugehörige Implementierung in Spring bekanntzumachen, öffnet man die Datei src/service/**/service/applicationContext-service.xml. In dieser Datei kann man eine auskommentierte Definition für die "personManager" Bean finden. Man entfernt diesen Kommentar, oder fügt folgende Zeilen am Ende der Datei ein. |
At line 200 changed 1 line. |
The "parent" attribute refers to a bean definition for a [TransactionProxyFactoryBean|http://www.springframework.org/docs/api/org/springframework/transaction/interceptor/TransactionProxyFactoryBean.html] that has all the basic transaction attributes set. |
Das "parent" Attribut bezieht sich auf eine Beandefinition für eine [TransactionProxyFactoryBean|http://www.springframework.org/docs/api/org/springframework/transaction/interceptor/TransactionProxyFactoryBean.html] , die alle grundlegenden Transaktionsattribute bereits gesetzt hat. |
At line 203 changed 1 line. |
!!Run the ManagerTest [#4] |
!!Den Manager Test ausführen [#4] |
At line 205 changed 1 line. |
Save all your edited files and try running __ant test-service -Dtestcase=PersonManager__. |
Jetzt speichert man alle Tests und versucht, __ant test-service -Dtestcase=PersonManager__ auszuführen. |
At line 213 changed 1 line. |
The files that were modified and added to this point are [available for download|https://appfuse.dev.java.net/files/documents/1397/7484/appfuse-tutorial-managers-1.6.zip]. |
Die Dateien, die bis zu diesem Punkt geändert oder erstellt wurden, sind [zum Download verfügbar|https://appfuse.dev.java.net/files/documents/1397/7484/appfuse-tutorial-managers-1.6.zip]. |
At line 215 changed 1 line. |
''Next Up:'' __Part III:__ [Creating Actions and JSPs|CreateActions] - A HowTo for creating Actions and JSPs in the AppFuse architecture. |
''Next Up:'' __Teil III:__ [Actions und JSPs erstellen|CreateActions_de] - Eine Anleitung zur Erstellung von Actions und JSPs in der Architektur von AppFuse. |