JAXenter.de

Das Portal für Java, Architektur, Cloud & Agile
X

Wieviel Cyborg steckt jetzt schon im Menschen? Die webinale VISIONS klärt auf.

Das Mockito Framework zum Testen mit Mock-Objekten

Tests frisch gemixt mit Mockito

Jan Stamer

Es gibt viele Bibliotheken, die das Testen mit Mock-Objekten erleichtern. Im Hause Cellent Finance Solutions nutzen wir das Framework Mockito und haben sehr gute Erfahrungen damit gemacht. In den folgenden Abschnitten wird Mockito mit den wichtigsten Funktionen und Vorzügen vorgestellt und erläutert. Danach haben Sie hoffentlich auch Lust, mal ein Schlückchen Mockito zu versuchen!

Tests sollen einen bestimmten Teil der Anwendung möglichst isoliert testen. Dies ist jedoch nicht ohne weiteres möglich, wenn Abhängigkeiten zu anderen Komponenten oder einer Infrastruktur bestehen. Diese Lücke kann oftmals durch Attrappen echter Objekte, so genannte "Mock"-Objekte geschlossen werden. Diese "Mock"-Objekte können dann beispielsweise eine Komponente imitieren. Die echte Komponente wird zur Laufzeit des Tests nicht mehr benötigt. Weitere Informationen zum Testen mit Mock-Objekten gibt Martin Fowler unter http://martinfowler.com/mocksArentStubs.html.

Mock-Objekte vereinfachen das Testen durch zwei wesentliche Funktionen. Zum einen kann ein Mock-Objekt das Verhalten eines echten Objekts imitieren. Zum anderen kann mit einem Mock-Objekt Verhalten überprüft werden. Nun schauen wir uns genauer an, wie Mockito diese zwei Funktionen erfüllt.

Mach mir das Objekt! - Verhalten imitieren

Es ist eine wahre Freude, mit Mockito Verhalten vorzugaukeln, das heißt ein Objekt zu imitieren. Dies betrachten wir gleich an einem Beispiel. Angenommen, es gibt einen Dienst CustomerService. Hinter diesem Dienst steckt in der Realität ein Web Service, der nur auf der Produktivumgebung des Kunden zur Verfügung steht. Um das Testen zu vereinfachen, wollen wir also nicht den echten Dienst verwenden, sondern ihn imitieren.

Der Dienst CustomerService hat eine Methode findCustomerIdByName, die zum Namen eines Kunden dessen Kundennummer liefert. Für den Test möchten wir nun erreichen, dass der Dienst für den Kunden mit Namen "Zaphod" die Kundennummer "42" liefert. Dieses Verhalten lässt sich durch einen einfachen Zweizeiler erreichen. Zunächst erzeugen wir mit dem Aufruf mock(CustomerService.class) ein Mock-Objekt. Nun geben wir dem Mock-Objekt vor, wie es sich verhalten soll. Dies erfolgt mit dem Aufruf:

when(customerService.findCustomerIdByName("Zaphod")).thenReturn("42");

Damit arbeitet der Dienst wie gewünscht, nämlich dass er beim Aufruf von findCustomerIdByName mit dem Argument "Zaphod" die Kundennummer "42" zurückgibt. Schon an diesem ersten Beispiel ist die verständliche und kompakte Syntax von Mockito zu erkennen.

Wird das Verhalten von Methoden imitiert, so können die Argumente flexibel sein. Soll beispielsweise der Aufruf von findCustomerIdByName für jeden Namen die Kundennummer "42" liefern, erreichen wir dies durch:

when(customerService.findCustomerIdByName(anyString()).thenReturn("42");

Der Trick hierbei ist, dass der Aufruf von anyString() einen so genannten ArgumentMatcher liefert (siehe Javadoc ArgumentMatcher). Der ArgumentMatcher anyString() trifft auf alle Strings zu. Analog dazu gibt es weitere ArgumentMatcher für diverse Objekte. Des Weiteren besteht die Möglichkeit, eigene ArgumentMatcher zu implementieren.

Die bislang vorgestellten Möglichkeiten reichen jedoch noch nicht aus, um das Verhalten von Methoden ohne Rückgabewert zu imitieren. Methoden ohne Rückgabewert haben lediglich die Möglichkeit, sich mit einem Fehler zu verabschieden. Dies wird in Mockito mit der Method doThrow() erreicht. So wird mit dem Code doThrow(new RuntimeException()).when(customerService).findCustomerIdByName("Joe") eine Exception ausgelöst, wenn nach einem Kunden mit Name "Joe" gesucht wird. Es können jedoch nicht nur Methoden ohne Rückgabewert, sondern auch alle anderen Methoden gezielt Exceptions auslösen.

Ein weiterer kniffliger Punkt sind statische Methoden und private Methoden, die als final deklariert sind. Solche Methoden lassen sich nicht mit Mockito testen. Hier schafft jedoch die Bibliothek PowerMock Abhilfe, die auch in einer Variante für Mockito zur Verfügung steht.

 
Verwandte Themen: 

Kommentare

Ihr Kommentar zum Thema

Als Gast kommentieren:

Gastkommentare werden nach redaktioneller Prüfung freigegeben (bitte Policy beachten).