Mit EasyMock können Mock-Objekte für automatisierte Tests dynamisch generiert werden. Die neue Version EasyMock 2.0 setzt Java 5.0 voraus und kann unter http://www.easymock.org/Downloads.html heruntergeladen werden.
In Unit Tests sollen Elemente der Software isoliert getestet werden. Ein Element funktioniert oft nur in Zusammenarbeit mit anderen Elementen. Um es in Isolation zu testen, müssen diese Mitarbeiter simuliert werden.
Ein Mock-Objekt ersetzt einen Mitarbeiter im Test. Es wird mit erwarteten Methodenaufrufen konfiguriert. Im Test überprüft es, ob die erwarteten Methodenaufrufe auftreten. Bei Abweichungen vom erwarteten Verhalten schlägt es so früh wie möglich fehl.
Um EasyMock 2.0 in Tests zu verwenden, müssen die Methoden einer Klasse importiert werden:
import static org.easymock.EasyMock.*;
Ein Mock-Objekt für eine Schnittstelle kann dann mit einer Programmzeile dynamisch erzeugt werden:
IWebSearch mock = createMock(IWebSearch.class);
Nach der Erzeugung des Mock-Objekts befindet es sich in der Aufnahmephase. Methodenaufrufe auf dem Mock-Objekt werden als Erwartungen interpretiert:
mock.registerURL("http://www.fscklog.com");
Rückgabewerte können mit einer einfachen Syntax definiert werden:
expect(mock.search("ruby rails")).andReturn("http://www.rubyonrails.org");
Ist das Mock-Objekt mit dem erwarteten Verhalten gefüttert, wird es in die Wiedergabephase umgeschaltet:
replay(mock);
Nun kann das Mock-Objekt im Test verwendet werden. Wird eine nicht erwartete Methode oder eine Methode mit anderen Argumenten als den erwarteten aufgerufen, wird eine Exception geworfen. Am Ende des Tests sollte noch geprüft werden, ob die erwarteten Methodenaufrufe tatsächlich stattgefunden haben. Das erledigt der Aufruf
verify(mock);
Standardmäßig werden die Argumente der erwarteten Methodenaufrufe mit equals() verglichen.
Falls es gewünscht ist, können diese Bedingungen abgeschwächt werden. Auch die Anzahl der erlaubten
Aufrufe kann geändert werden. Das folgende Programmstück definiert die Erwartung, das die Methode
search() mindestens einmal mit einem Argument aufgerufen wird, das die Begriffe
ruby und rails enthält. Für alle Aufrufe wird http://www.rubyonrails.org
zurückgegeben:
expect(mock.search(and(contains("ruby"), contains("rails"))))
.andReturn("http://www.rubyonrails.org").atLeastOnce();
Die Dokumentation von EasyMock demonstriert alle Möglichkeiten von EasyMock. Sie ist im Download enthalten und online verfügbar unter http://easymock.org/EasyMock2_0_Documentation.html.
Im Buch Testgetriebene Entwicklung mit JUnit & FIT beschreibt Frank Westphal ausführlich, wie Mock-Objekte helfen können, Teile eines Systems im Unit Test isoliert zu testen.