JMock ist eine Bibliothek zur testgetriebenen Softwareentwicklung. Dabei werden sogenannte Mock-Objekte als Dummy Objekte verwendet. Mock steht im englischen für vortäuschen. Die Mock-Objekte werden als Platzhalter für echte Objekte innerhalb von Unit-Tests verwendet. Die Mock-Objekte implementieren dabei die Schnittstellen, über die das zu testende Objekt auf seine Umgebung zugreift. Mocks stellen dabei sicher, dass die erwarteten Methodenaufrufe vollständig mit den korrekten Parametern und in der richtigen Reihenfolge aufgerufen bzw. durchgeführt werden.
JMock bietet eine einfache Möglichkeit nicht vorhandene Klassen durch sogenannte Mock-Objekte zu testen, in dem diese vorgetäuscht werden. Die Bibliothek ist sehr einfach und intuitiv zu nutzen. Die mitgelieferte Dokumentation auf der Herstellerwebseite ist sehr gut und sehr umfangreich und bietet gerade unerfahrenen Nutzern einen sehr guten Einstieg. Besonders hilfreich ist die Rubrik "Cheat Sheet". In diesem Bereich werden alle wichtigen Funktionen und Befehle von jMock in einem Überblick dargestellt.
JMock wird von Softwareentwicklern und -testern in der testgetriebenen Softwareentwicklung eingesetzt, um nicht vorhandene Objekte mit Mocks vorzutäuschen. Die jMock Version 2.5.0 ist kompatibel zu Java 1.5, JUnit 3 und 4.
JMock kann in jeder beliebigen Entwicklungsumgebung genutzt werden, dazu müssen die verschiedenen Jar-Dateien dem Projektklassenpfad hinzugefügt werden.
Die Installation ist sehr einfach. Es muss kein Installer ausgeführt werden, lediglich die heruntergeladenen Jar-Datein müssen
dem Projektklassenpfad hinzugefügt werden.
Eclipse: Projekt -> Properties -> Java Build Path -> Add external Jar -> *.jar auswählen
Netbeans: Projekt -> Properties -> Libraries -> Add Jar -> *.jar auswählen
Für JUnit 4 sind folgende Jar-Dateien dem Klassenpfad hinzuzufügen:
Die Dokumentation von jMock befindet sich ausschließlich auf der Herstellerwebseite und liegt in englischer Sprache vor. Bestandteile der sehr guten und ausführlichen Dokumentation sind:
Bereits auf der Startseite von jMock wird man direkt auf zwei sehr gute Rubriken hingewiesen, diese sind Get Started und Get Training. Im Bereich Get Started wird ein einführendes Beispiel vorgestellt, dabei hat man die Möglichkeit zwischen verschiedenen Testumgebungen zu wählen (JUnit 3, 4 oder andere). Je nach Auswahl der Testumgebung verändert sich das Beispiel entsprechend. Auf dieser Seite erhält man bereits einen sehr guten Einblick über die Funktionalität von jMock. Im Bereich Get Training wird man auf die Seite von www.mockobjects.com verlinkt. Dort wird in verschiedenen Kapiteln der Umgang mit Mocks erläutert. Um den gesamten Umfang von jMock kennenzulernen, wird auf der Webseite die Rubrik Cookbook angeboten. Dieser Bereich ist sehr umfangreich und gut beschrieben und zeigt alle Möglichkeiten von jMock. Der Aufbau dieser Rubrik ist sehr gut, jede Funktion wird mit Hilfe von sprechenden Beispielen erläutert. Die Seite Cheat Sheet bietet einen Überblick zu den Methoden von jMock und deren Funktionalität. Dieser Überblick erweist sich gerade zu Beginn für Einsteiger als sehr nützlich, da alle Methoden auf einen Blick mit Erklärungen sichtbar sind. Des Weiteren befinden sich auf der Webseite die API Dokumentation, verschiedene Artikel über jMock und ein RSS News Feed der abonniert werden kann, um bei jeder Änderung am Projekt informiert zu werden. Die gesamte Dokumentation von jMock ist sehr gut und übersichtlich gestaltet. Die Funktionalität wird mit sprechenden Beispielen dokumentiert und beschrieben.
Die Projektseite von jMock ist sehr übersichtlich gestaltet, alle wichtigen Informationen sind vorhanden und leicht zugänglich. Bereits auf der Startseite erhält man einen Überblick über jMock, sowie eine erste Navigationshilfe zu sehr guten und relevanten Themen, wenn man noch nie mit jMock gearbeitet hat. Die Projektseite wird stetig mit jedem Release weiterentwickelt.
Auf der Projektseite befindet sich eine Rubrik User Support. In diesem Bereich wird eine Mailing-Liste angeboten, ein Trainings Bereich in dem man auf eine andere Webseite verlinkt wird, die einen Einblick in die Mockentwicklung bietet. Im Bereich Issue Tracker wird auf die Webseite von codehaus.org verlinkt, wo ein Bug Tracker System eingerichtet ist, indem man Bugs berichten und einsehen kann. Zusätzlich befindet sich auf dieser Seite eine Roadmap mit einer Übersicht auf zukünftige Entwicklungen. Ein weiteres nettes Feature im Bereich User Support ist der RSS News Feed zur jMock-Projektseite. Dieser Nachrichtendienst kann abonniert werden, um bei Änderungen und Neuigkeiten über jMock automatisch informiert zu werden.
Die intuitive Nutzbarkeit von jMock ist sehr einfach und gut. Mit Hilfe von jMock werden nicht vorhandene Klassen getestet. Für die Umsetzung wird ein Interface benötigt, welches getestet werden soll. Um dieses Interface entsprechend zu testen, wird ein Mock Objekt von diesem Interface angelegt. Mit Hilfe des Mock Objektes und Expectations (Erwartungen) wird dann die Funktionalität getestet. Da jMock auf JUnit aufsetzt, können Ergebnisse mit Assert-Methoden einfach überprüft werden. Das Ergebnis wird in der JUnit üblichen Übersicht dargestellt.
Eine Automatisierung ist mit Hilfe von JUnit 3 oder JUnit 4 möglich.
<dependency>
-Elements realisiert. Davor müssen die JMock-Bibliotheken noch in das lokale Repository von Maven übertragen werden. Die folgenden Befehle erledigen diesen Aspekt:
mvn install:install-file -DgroupId=hamcrest-core -DartifactId=hamcrest-core -Dversion=1.1 -Dfile=hamcrest-core-1.1.jar -Dpackaging=jar -DgeneratePom=true
mvn install:install-file -DgroupId=hamcrest-library -DartifactId=hamcrest-library -Dversion=1.1 -Dfile=hamcrest-library-1.1.jar -Dpackaging=jar -DgeneratePom=true
mvn install:install-file -DgroupId=jmock -DartifactId=jmock -Dversion=2.5.1 -Dfile=jmock-2.5.1.jar -Dpackaging=jar -DgeneratePom=true
mvn install:install-file -DgroupId=jmock-junit4 -DartifactId=jmock-junit4 -Dversion=2.5.1 -Dfile=jmock-junit4-2.5.1.jar -Dpackaging=jar -DgeneratePom=true
mvn test
wird der Testfall angestoßen und ausgeführt. Die Ergebnisse lassen sich dann im Target
-Verzeichnis finden.
context.assertIsSatisfied();
ausgeführt werden.
@Test
public void oneSubscriberReceivesAMessage() {
// set up - Erstellen des Mocks
final Subscriber subscriber = context.mock(Subscriber.class);
Publisher publisher = new Publisher();
publisher.add(subscriber);
final String message = "message";
// expectations
// Wird einmal geprueft, ob das Mock Objekt die Nachricht erhalten hat
// Erwartet das receive() noch einmal aufgerufen wird
context.checking(new Expectations() {{
one (subscriber).receive(message);
}});
// execute
// Alle Subscriber werden ueber die neue Nachricht informiert
publisher.publish(message);
// wurde receive() einmal ausgefuehrt? (In diesem Fall ueber publisher.publish(message);)
context.assertIsSatisfied();
// Wird geprueft, ob auch die richtige Nachricht angekommen ist
assertSame(message, publisher.getString());
}