Mocking unter C#/.NET



Ähnliche Dokumente
Anleitung über den Umgang mit Schildern

Lineargleichungssysteme: Additions-/ Subtraktionsverfahren

L10N-Manager 3. Netzwerktreffen der Hochschulübersetzer/i nnen Mannheim 10. Mai 2016

Softwaretests in Visual Studio 2010 Ultimate Vergleich mit Java-Testwerkzeugen. Alexander Schunk Marcel Teuber Henry Trobisch

4 Aufzählungen und Listen erstellen

Stundenerfassung Version 1.8 Anleitung Arbeiten mit Replikaten

Outlook. sysplus.ch outlook - mail-grundlagen Seite 1/8. Mail-Grundlagen. Posteingang

Nicht kopieren. Der neue Report von: Stefan Ploberger. 1. Ausgabe 2003

Einführung in die Programmierung

Übung 1 mit C# 6.0 MATTHIAS RONCORONI

Step by Step Softwareverteilung unter Novell. von Christian Bartl

etutor Benutzerhandbuch XQuery Benutzerhandbuch Georg Nitsche

Webalizer HOWTO. Stand:

PHP - Projekt Personalverwaltung. Erstellt von James Schüpbach

S/W mit PhotoLine. Inhaltsverzeichnis. PhotoLine

MSXFORUM - Exchange Server 2003 > SMTP Konfiguration von Exchange 2003

Hilfedatei der Oden$-Börse Stand Juni 2014

Handbuch Fischertechnik-Einzelteiltabelle V3.7.3

iphone- und ipad-praxis: Kalender optimal synchronisieren

Testen mit JUnit. Motivation

Informationen zur Verwendung von Visual Studio und cmake

Zählen von Objekten einer bestimmten Klasse

Mediator 9 - Lernprogramm

Version smarter mobile(zu finden unter Einstellungen, Siehe Bild) : Gerät/Typ(z.B. Panasonic Toughbook, Ipad Air, Handy Samsung S1):

Enigmail Konfiguration

1. Adressen für den Serienversand (Briefe Katalogdruck Werbung/Anfrage ) auswählen. Die Auswahl kann gespeichert werden.

Dieses Tutorial gibt eine Übersicht der Form Klassen von Struts, welche Besonderheiten und Unterschiede diese aufweisen.

Bedienungsanleitung: Onlineverifizierung von qualifiziert signierten PDF-Dateien

Erstellen der Barcode-Etiketten:

teamsync Kurzanleitung

Installation der Demoversion vom M-Doc AutoSigner

Simulation LIF5000. Abbildung 1

HANDBUCH PHOENIX II - DOKUMENTENVERWALTUNG

Technische Dokumentation SilentStatistikTool

Objektorientierte Programmierung

Visual Basic Express erstes Projekt anlegen

Einführung in TexMaker

Stand: Adressnummern ändern Modulbeschreibung

Informationen zu den regionalen Startseiten

Der große VideoClip- Wettbewerb von Media Markt.

5.2 Neue Projekte erstellen

A. Ersetzung einer veralteten Govello-ID ( Absenderadresse )

Anleitung zum Erstellen eines Freihaltetermins

WinWerk. Prozess 6a Rabatt gemäss Vorjahresverbrauch. KMU Ratgeber AG. Inhaltsverzeichnis. Im Ifang Effretikon

Handbuch. NAFI Online-Spezial. Kunden- / Datenverwaltung. 1. Auflage. (Stand: )

Geld Verdienen im Internet leicht gemacht

GEONET Anleitung für Web-Autoren

WPF Steuerelemente Listbox, ComboBox, ListView,

Welche Gedanken wir uns für die Erstellung einer Präsentation machen, sollen Ihnen die folgende Folien zeigen.

Verschlüsselung mit PGP. Teil 1: Installation

Medea3 Print-Client (m3_print)

Folge 18 - Vererbung

Installation OMNIKEY 3121 USB

Handbuch zur Anlage von Turnieren auf der NÖEV-Homepage

Anleitung für Autoren auf sv-bofsheim.de

AutoCAD Dienstprogramm zur Lizenzübertragung

Anwendertreffen 20./21. Juni

Mit dem Tool Stundenverwaltung von Hanno Kniebel erhalten Sie die Möglichkeit zur effizienten Verwaltung von Montagezeiten Ihrer Mitarbeiter.

Downloadfehler in DEHSt-VPSMail. Workaround zum Umgang mit einem Downloadfehler

Die Captimizer BTZ-Datei 2015

Anzeige von eingescannten Rechnungen

Barcodedatei importieren

Flash Videos einbinden

SRH - Kurzinformation

Drucken aus der Anwendung

Erstellen einer Collage. Zuerst ein leeres Dokument erzeugen, auf dem alle anderen Bilder zusammengefügt werden sollen (über [Datei] > [Neu])

MORE Profile. Pass- und Lizenzverwaltungssystem. Stand: MORE Projects GmbH

S7-Hantierungsbausteine für R355, R6000 und R2700

Ihr Benutzerhandbuch AVIRA ANTIVIR EXCHANGE

.htaccess HOWTO. zum Schutz von Dateien und Verzeichnissen mittels Passwortabfrage

BEDIENUNG ABADISCOVER

Fachgebiet Informationssysteme Prof. Dr.-Ing. N. Fuhr. Programmierung Prof. Dr.-Ing. Nobert Fuhr. Übungsblatt Nr. 6

Mit der Maus im Menü links auf den Menüpunkt 'Seiten' gehen und auf 'Erstellen klicken.

Binäre Bäume. 1. Allgemeines. 2. Funktionsweise. 2.1 Eintragen

Java: Vererbung. Teil 3: super()

Matrix42. Use Case - Sicherung und Rücksicherung persönlicher Einstellungen über Personal Backup. Version September

SMS/ MMS Multimedia Center

Neuinstallation Einzelplatzversion

So geht s Schritt-für-Schritt-Anleitung

CMS.R. Bedienungsanleitung. Modul Cron. Copyright CMS.R Revision 1

Anleitung: Ändern von Seiteninhalten und anlegen eines News Beitrags auf der Homepage des DAV Zorneding

Anton Ochsenkühn. amac BUCH VERLAG. Ecxel für Mac. amac-buch Verlag

Beweisbar sichere Verschlüsselung

Warum Sie jetzt kein Onlinemarketing brauchen! Ab wann ist Onlinemarketing. So finden Sie heraus, wann Ihre Website bereit ist optimiert zu werden

FMGate Installation & Benutzung

PocketPC.ch Review. SBSH ilauncher 3.1. Erstelldatum: 3. Dezember 2007 Letzte Änderung: 3. Dezember PocketPC.ch_Review_iLauncher.

2010 Ing. Punzenberger COPA-DATA GmbH. Alle Rechte vorbehalten.

Viele Bilder auf der FA-Homepage

Anleitung zur Verwendung der VVW-Word-Vorlagen

Pfötchenhoffung e.v. Tier Manager

Kurzanleitung LFB-Online für Schulen

Drucken von Webseiten Eine Anleitung, Version 1.0

Mailverteiler. HowTo. Erstellen von Mailverteilern im mytum Portal. Version 1.0. preliminary

E Mail Versand mit der Schild NRW Formularverwaltung

Einführung zum Arbeiten mit Microsoft Visual C Express Edition

Hinweise zur Datensicherung für die - Prüfmittelverwaltung - Inhalt

TYPO3 Tipps und Tricks

1. Aktionen-Palette durch "Fenster /Aktionen ALT+F9" öffnen. 2. Anlegen eines neuen Set über "Neues Set..." (über das kleine Dreieck zu erreichen)

Speicher in der Cloud

Transkript:

Wahlfach Software-Qualität Mocking unter C#/.NET Mit dem Schwerpunkt RhinoMocks Matrikelnummer: 397882 08.02.2011

Inhaltsverzeichnis 1 NMock... 5 1.1 Homepage... 5 1.2 Lizenz... 5 1.3 Kurzbeschreibung... 5 2 EasyMock.NET... 5 2.1 Homepage... 5 2.2 Lizenz... 5 2.3 Kurzbeschreibung... 5 3 TypeMock Isolator... 5 3.1 Homepage... 5 3.2 Lizenz... 5 3.3 Kurzbeschreibung... 5 4 Moq... 5 4.1 Homepage... 5 4.2 Lizenz... 6 4.3 Kurzbeschreibung... 6 5 Rhino Mocks... 6 5.1 Homepage... 6 5.2 Dokumentation:... 6 5.3 Lizenz... 6 5.4 Untersuchte Version... 6 5.5 Letzter Untersuchtungszeitpunkt... 6 5.6 Kurzbeschreibung... 6 5.7 Installation... 7 5.8 Dokumentation... 7 5.9 Wartung der Projektseite... 8 5.10 Intuitive Benutzbarkeit... 8 5.11 Einführendes Beispiel und genereller Aufbau... 8 5.12 Detaillierte Beschreibung... 9 5.12.1 Verschiedene Arten zu mocken... 10 5.12.2 Stubs... 10 5.12.3 Erwartete Reihenfolge von Methodenaufrufen... 10 5.12.4 Delegate-Methoden... 11 5.12.5 Event Handling und IEventRaiser... 12 5.12.6 Rückgabewerte festsetzen... 12 5.12.7 Alternativer Weg beim Setzen von Erwartungen mit 'With'... 13 5.13 Weitere Möglichkeiten und Funktionen... 13 5.13.1 Generelles... 13 5.13.2 Events... 13 2

5.13.3 Properties... 14 5.13.4 Callbacks... 14 5.13.5 Do-Handler... 14 6 Quellen und hilfreiche Links... 15 3

Abbildungsverzeichnis Abbildung 1: Verweise für Rhino-Mocks... 7 Listingverzeichnis Listing 1: Einführungsbeispiel von RhinoMocks... 9 Listing 2: IDatabase-Interface... 9 Listing 3: Mocking-Typen unter RhinoMocks... 10 Listing 4: Stubs unter RhinoMocks... 10 Listing 5: Erwartete Reihenfolge von Methodenaufrufen unter RhinoMocks... 11 Listing 6: Delegate-Beispiel unter RhinoMocks... 12 Listing 7: Event-Handling Beispiel unter RhinoMocks... 12 Listing 8: DatabaseCheck-Klasse... 12 Listing 9: Setzen von Rückgabewerten unter RhinoMocks... 13 Listing 10: IUser-Interface... 13 Listing 11: Test mit With... 13

1 NMock 1.1 Homepage http://www.nmock.org/ 1.2 Lizenz Das Framwork steht zur freien Verfügung unter dem Vorbehalt für keine entstehenden Schäden zu haften, die durch NMocks oder ein Modifikation von NMocks enstehen. 1.3 Kurzbeschreibung Es handelt sich um eine dynamische Bibliothek für Mock-Objekte für das.net-framework. Erwartungen werden schon beim Ausführen des Quelltextes durchgeführt, anstatt dies später über Asserts oder Ähnliches zu erledigen. Gemockte Interfaces werden zur Laufzeit erstellt. Fehlermeldungen sollen eindeutig auf den Fehler führen und das Setzen von flexiblen Erwartungen an Methoden kann durch Benutzen einer Constraints-Bibliothek geschehen. 2 EasyMock.NET 2.1 Homepage http://sourceforge.net/projects/easymocknet/ 2.2 Lizenz BSD-Lizenz 2.3 Kurzbeschreibung Klassenbibliothek, um einfach Mock-Objekte für Interfaces zu erstellen. Ist Teil des EasyMock Framworks. 3 TypeMock Isolator 3.1 Homepage http://www.typemock.com/ 3.2 Lizenz Trial-Version kostenfrei, danach je nach Version und Paket: Entwickler-Lizenz kostet 799 und 150 jedes weitere Jahr. 3.3 Kurzbeschreibung Einzig gefundenes kommerzielle Mocking-Tool. Bietet unter anderem die Möglichkeit das Verhalten von statischen Methoden, versiegelten Klassen und privaten Methoden zu verändern, ohne angeblich den Quelltext direkt selbst groß zuverändern. 4 Moq 4.1 Homepage http://code.google.com/p/moq/ 5

4.2 Lizenz neue BSD-Lizenz 4.3 Kurzbeschreibung Spezielle für.net 3.5 entwickelte Klassenbibliothek, um alle Features von.net 3.5 nutzen zu können. Die API soll extrem einfach und leicht zu bedienen sein. Vorwissen für Mocking soll nicht notwendig sein um Moq gut benutzen zu können. 5 Rhino Mocks 5.1 Homepage http://www.ayende.com/projects/rhino-mocks.aspx 5.2 Dokumentation: http://www.ayende.com/wiki/rhino+mocks+documentation.ashx 5.3 Lizenz Frei unter der BSD-Lizenz 5.4 Untersuchte Version Rhino Mocks 3.5 - For.Net 3.5 04/10/2008 18:26:00 Published by Ayende Rahien 5.5 Letzter Untersuchtungszeitpunkt 02.01.2011 5.6 Kurzbeschreibung Rhino Mocks ist eine Zusammenfassung von Klassenbibliotheken zum Mocken von Klassen unter C#. Verschiedene Versionen existieren für.net 3.5,.NET 2.0 und Silverlight. Zur Testerstellung wird außerdem NUnit oder MbUnit benötigt. Wahrscheinlich lassen sich auch äquivalente Tools benutzen. Getestet wurden allerdings nur die zwei Genannten. Funktional hat Rhino Mocks Folgendes zu bieten: Verwendung vom expliziten Aufzeichnung-und-Wiederholungs-Modell Natural Arrange, Act, Assert-Syntax Setzen von Erwartungen von Verhalten von Klassen/Funktionen basierend auf : o Vergleich von Argumenten o Vergleich von Constraints o Callbacks zum Abgleichen von erwarteten Argumenten(später näher beschrieben) o Setzen von Aktionen von Methoden, Rückgabewerten, oder werfen von Ausnahmen 6

5.7 Installation Vorrausgesetzt wird eine Entwicklungsumgebung und Nunit oder MbUnit. Zum Test wurde Mircosoft Visual Studio Ultimate 2010 als Entwicklungsumgebung verwendet. Benötigt wird von NUnit/MbUnit die entsprechende Dynamic Link Library Datei. Nachdem Download von RhinoMocks ( http://www.ayende.com/projects/rhinomocks/downloads.aspx ) kann dies einfach in ein beliebiges, am besten gut wieder zu findendes Verzeichnis entpackt werden. Dort befindet sich die Datei Rhino.Mocks.dll. Nun wird die Entwicklungsumgebung geöffnet und ein neues oder vorhandenes Projekt geladen. Als nächstes wird eine Klassenbibliothek erstellt, die der Test testen soll. Um Rhino Mocks zu benutzen, wird die Framework.dll von NUnit/MbUnit und die herruntergeladene RhinoMocks.dll als Verweis/Reference der Klassenbibliothek hinzugefügt. Zu sehen ist dies in Abbildung 1 1. Abbildung 1: Verweise für Rhino-Mocks 5.8 Dokumentation Die Dokumentation ist sehr umfassend und leicht zugänglich, soweit man etwas Erfahrung mit C# oder Java hat. Sie ist komplett auf Englisch gehalten, übersetzte Versionen gibt es scheinbar nicht. Verschiedene Kapitel gehen schrittweise auf die Möglichkeiten der Nutzung von RhinoMocks ein. Dazu gibt es Quelltext-Beispiele, die aber bei den "komplexeren" Beispielen manchmal nicht voll funktionsfähig sind. Die Quick-Search-Funktion auf der Seite scheint nicht richtig zu funktionieren. Weiterhin ist am unteren Rand eine Schnell-Referenz der Versionen 3.1(ohne Beispiele) und 3.3 (mit Beispielen) als PDF-Datei vorhanden. Auf der Hauptseite existiert noch eine "API- Documentation"( http://www.ayende.com/projects/rhino-mocks/api/files/mockrepositorycs.html ), die zu einer Übersicht der verwendbaren Methoden führt. Zu den meisten dieser Methoden gibt ein kurzes Beispiel. 1 Verwenden von mehreren Frameworks kann zu Konflikten führen, die zum Resultat führen, dass RhinoMocks nicht funktioniert. Das Hinzufügen des Verweises ist allerdings unproblematisch 7

Weiterhin hat der Autor auch ein Klassendiagramm der Version 2.5.2 (http://www.ayende.com/images/rhinodiagram.png) veröffentlicht. Unter http://www.ayende.com/hibernating-rhinos.aspx ist ein Video zur Einführung von RhinoMocks zu finden. Dort werden die Grundlagen zu RhinoMocks in ca 52 Minuten auf englischer Sprache erklärt. Abschließend ist zu sagen, dass sich die Autoren viel Mühe mit der Dokumentation gemacht haben und es dadurch gut möglich ist sich zu RhinoMocks Zugang zu verschaffen. 5.9 Wartung der Projektseite Die Seite macht einen guten und übersichtlichen Eindruck. Die letzte News ist vom 1.9.2009. Es gibt einen Blog, der direkt auf der Hauptseite verlinkt ist. Dieser scheint noch in Benutzung zu sein. Hier können Fragen und Kommentare abgegeben werden. Der letzte Eintrag ist von Anfang Februar 2011. Erreichen kann man den Autor über Telefon und Email unter dem Punkt "About Me" auf der Hauptseite. Die Download-Seite ist gut dokumentiert und das jeweilige Erscheinungsdatum wird immer angezeigt. Versionen in neuerer Zeit sind nicht erschienen, was daran liegen kann, das dass Tool ziemlich vollständig wirkt. 5.10 Intuitive Benutzbarkeit Durch die gelungende Dokumentation und das Einführungsvideo lässt sich RhinoMocks recht schnell und gut nutzen. Die häufigen Quelltext-Beispiele sind dabei sehr hilfreich. Sofern man sich etwas mit Java oder C# auskennt, wird man sich schnell einarbeiten können. 5.11 Einführendes Beispiel und genereller Aufbau Für diesen Abschnitt wird angenommen, dass die Installation wie oben dargestellt durchgeführt wurde. Um eine Testklasse zu kennzeichnen, muss das Attribut '[TestFixture]' direkt vor der Klassendefinition eingetragen werden. Tests werden als Methoden geschrieben (in der Regel mit dem Rückgabewert void und ohne Parameter). Sie müssen mit dem Attribut '' gekennzeichnet werden. Es besteht die Möglichkeit Methoden zu schreiben, die vor und nach jedem Test ausgeführt werden. Gekennzeichnet werden sie mit '[Setup]' und '[TearDown]' 2. Die Hauptklasse zur Benutzung von RhinoMocks ist 'MockRepository'. Mit dieser wird ein Objekt erzeugt, welches die Mock-Objekte für die Interfaces erzeugt: 'new MockRepository()'. Durch Aufrufen der Methode 'CreateMock<Interface>()' kann einem Interface der enstprechende Mock zugeordnet werden. Es gibt noch weitere Möglichkeiten ein 3 Mock-Objekt zu erzeugen. Nun müssen die erwarteten Aufrufe festgelegt werden: 'Expect.Call(objekt.methode).Return(rückgabewert)' Bei Methoden ohne Parameter und ohne Rückgabewert kann die Return-Anweisung weggelassen werden. 2 Für genauere Informationen siehe Kapitel NUnit 3 Siehe dazu Kapitel 5.12 Detaillierte Beschreibung (Seite 9) 8

Sollte es sich um eine Methode mit Parametern und ohne Rückgabewert handeln, muss man die erwartete Methode als 'delegate' im Argument des Calls definieren (siehe 5.12.3 Erwartete Reihenfolge von Methodenaufrufen, Listing 5). Nachdem alle erwarteten Aufrufe beschrieben wurden, muss das erwartete Verhalten gegen den wirklichen Aufruf ausgewertet werden: 'mockrepository.replayall()' Danach muss die entsprechende Methode des entsprechenden Objekts aufgerufen werden. 'mocksrepository.verifyall()' Damit werden die Erwartungen gegen die Aufrufe ausgewertet. [TestFixture] public class RhinoMock_Tests{ private MockRepository Mocks; [SetUp] public void TestSetup(){ Mocks = new MockRepository(); [TearDown] public void TestTearDown(){ Mocks.VerifyAll(); public void GeneralClassMocking(){ //IDatabase database = mocks.dynamicmock<idatabase>(); //IDatabase database = mocks.strictmock<idatabase>(); IDatabase database = Mocks.CreateMock<IDatabase>(); Expect.Call(database.ConnectionEtasblished()).Return(true); Mocks.ReplayAll(); Assert.True(database.ConnectionEtasblished()); Listing 1: Einführungsbeispiel von RhinoMocks Um den Test nun aufzurufen, muss die entsprechende Datei kompiliert und anschließend mit NUnit ausgeführt werden. public interface IDatabase{ event EventHandler Load; void DeleteDatabaseByID(int id); bool ConnectionEtasblished(); bool ConnectionTerminated(); int MaximumConnections { get; set; Listing 2: IDatabase-Interface 5.12 Detaillierte Beschreibung Nach diesem kleinen Beispiel, werden nun die Einsatzmöglichkeiten von RhinoMocks beschrieben. Die Themen sind angelehnt an die Dokumentation, da diese einen gut strukturierten Aufbau hat. Die Quelltext-Beispiele sind vollständig lauffähig und sollen die Beschreibungen verdeutlichen. 9

5.12.1 Verschiedene Arten zu mocken Neben der Standardmöglichkeit Mock-Objekte zu erzeugen gibt es noch die Möglichkeit des Strict/Dynamic/Partial-Mocks. Bei dem Strict-Mock muss jeder erwartete Methodenaufruf auch wirklich stattfinden, ansonsten wird eine Ausnahme geworfen und der Test wird als fehlerhaft abgeschlossen. Beim Dynamic-Mock werden alle unerwarteten Aufrufe schlicht ignoriert. Die ist sinnvoll wenn egal ist was sonst noch für Aufrufe stattfinden. Generell ist der Strict-Mock öfters einsetzbar, da man sich Gedanken machen muss, wo welche Methode aufgerufen werden soll. Partial-Mocks werden meist verwendet um nur bestimmte Teile von Klassen, wie zum Beispiel einzelne Methoden einer Klasse, zu mocken. public void GeneralClassMocking(){ //IDatabase database = mocks.dynamicmock<idatabase>(); //IDatabase database = mocks.strictmock<idatabase>(); IDatabase database = Mocks.CreateMock<IDatabase>(); Expect.Call(database.ConnectionEtasblished()).Return(true); Mocks.ReplayAll(); Assert.True(database.ConnectionEtasblished()); public void PartialMockTest(){ Server server = Mocks.PartialMock<Server>(); //partielles Mocken IDatabase database = Mocks.StrictMock<IDatabase>(); Expect.Call(server.SelectDatabase(42)).Return(database); Mocks.ReplayAll(); server.selectdatabase(42); Listing 3: Mocking-Typen unter RhinoMocks 5.12.2 Stubs Durch Stubs lassen sich Variablen in Interfaces simulieren. Stubs simulieren getter und setter für Variablen in einem Interface. public void GenerateStubTest(){ IDatabase database; // database = mocks.generatestub<idatabase>(); -- GenerateStub Methode // database = (IDatabase) mocks.stub(typeof(idatabase), null); // Unter.Net 1.1 database = Mocks.Stub<IDatabase>(); database.maximumconnections = 4; Assert.AreEqual(database.MaximumConnections, 4); Mocks.ReplayAll(); Listing 4: Stubs unter RhinoMocks 5.12.3 Erwartete Reihenfolge von Methodenaufrufen Durch RhinoMocks lässt sich festlegen, ob Methodenaufrufe in bestimmter Reihenfolge erwartet werden. Die Standardeinstellung ist, dass sie in keiner bestimmten Reihenfolge erwartet werden. Möchte man eine erwartete Reihenfolge festlegen geschieht dies durch: 10

'using (mockrepository.ordered()){ Quelltext ' Werden danach noch Aufrufe in beliebiger Reihenfolge erwartet kann man dies so beschreiben: 'using (mockrepository.unordered()){ Quelltext ' Werden Aufrufe dann in der falschen Reihenfolge aufgerufen, schlägt der Test fehl. Es lassen sich 'Unordered' und 'Ordered' beliebig kombinieren. public void OrderedAndUnorderedTest(){ IDatabase database = Mocks.DynamicMock<IDatabase>(); using (Mocks.Ordered()) Expect.Call(delegate { database.deletedatabasebyid(42); ); Expect.Call(database.ConnectionEtasblished()).Return(true); Expect.Call(database.ConnectionTerminated()).Return(true); using (Mocks.Unordered()) Expect.Call(database.ConnectionTerminated()).Return(false); Expect.Call(database.ConnectionEtasblished()).Return(true); Mocks.ReplayAll(); database.deletedatabasebyid(42); database.connectionetasblished(); database.connectionterminated(); database.connectionetasblished(); database.connectionterminated(); Listing 5: Erwartete Reihenfolge von Methodenaufrufen unter RhinoMocks An diesem Beispiel wird gezeigt wie Methoden ohne Rückgabewert und mit Parametern deklariert werden müssen damit sie aktzeptiert werden. Näheres zu diesem Problem : http://ayende.com/blog/archive/2007/10/27/using- Expect.Call-void-method.aspx 5.12.4 Delegate-Methoden RhinoMocks bietet auch das Mocken von Delegate-Methoden an. Das Beispiel spricht größtenteils für sich. Die GenerateStub-Methode erzeugt eine Methode die als Parameter 2 Int-Werte hat. Bei dem ersten Wert handelt sich um den Übergabeparameter der zu erzeugenden Methode und der letzte Wert gibt den Rückgabetyp der Methode an. Der letzte Parameter ist immer der Rückgabetyp, sodass man theoretisch beliebigviele Parameter angeben kann. Die Stub-Methode sagt, was passieren soll, wenn sie aufgerufen wird. In diesem Fall soll x den Wert 42 erhalten. 11

public void DelegateMethods(){ var stubmapper = MockRepository.GenerateStub<Func<int, int>>(); int expectedresult = 42; stubmapper.stub(x => x(42)).return(expectedresult); BackUpServer backupserver = new BackUpServer(stubMapper); int result = backupserver.dosomething(42); Assert.AreEqual(expectedResult, result); Listing 6: Delegate-Beispiel unter RhinoMocks 5.12.5 Event Handling und IEventRaiser Weiterhin bietet RhinoMocks das Mocken von Event und bietet dafür diverse Interfaces an. Das Beispiel steht hier exemplarisch für eine der Möglichkeiten des Event Handlings. Weitere Information zum Event Handling bietet die ausführliche Dokumentation. public void FakingRaisedEvent(){ object obj = new object(); EventArgs args = new EventArgs(); IDatabase database = Mocks.DynamicMock<IDatabase>(); database.load += null; LastCall.IgnoreArguments(); IEventRaiser raiseviewevent = LastCall.GetEventRaiser(); Mocks.ReplayAll(); DatabaseCheck datacheck = new DatabaseCheck(database); raiseviewevent.raise(obj,args); Assert.IsTrue(dataCheck.OnLoadCalled); Listing 7: Event-Handling Beispiel unter RhinoMocks public class DatabaseCheck{ public bool OnLoadCalled = false; public DatabaseCheck(IDatabase database){ database.load += ExecuteDatabaseCheck; private void ExecuteDatabaseCheck(object sender, EventArgs e){ OnLoadCalled = true; Listing 8: DatabaseCheck-Klasse 5.12.6 Rückgabewerte festsetzen Wenn egal ist, wie oft eine Funktion aufgerufen wird und es gewünscht ist, dass sie immer den Rückgabewert innerhalb eines Tests hat, bietet RhinoMocks die Möglichkeit mit 'SetupResult' den Rückgabewert festzulegen. 12

public void SetupResultTest(){ IUser user = Mocks.StrictMock<IUser>(); SetupResult.For(user.Anmelden(null)).Return(true); SetupResult.For(user.Abmelden()).Return(false); Mocks.ReplayAll(); Assert.True(user.Anmelden(null)); Assert.False(user.Abmelden()); Listing 9: Setzen von Rückgabewerten unter RhinoMocks public interface IUser{ bool Anmelden(IDatabase database); bool Abmelden(); Listing 10: IUser-Interface 5.12.7 Alternativer Weg beim Setzen von Erwartungen mit 'With' Der Autor bietet mit der With-Klasse eine Möglichkeit an bei einer Kette von Methoden den erwarteten Aufruf zu setzen, den Rückgabewert festzulegen und zu prüfen, ob die erwarteten Aufrufe auch so stattgefunden haben. Diese Schreibweise ist kompakter und setzt den Einsatz von delegate-methoden vorraus. Als weiterer Ansatz gibt es dadurch die Möglichkeit, Tests zusammenzufassen public void WithTest(){ IDatabase database = Mocks.StrictMock<IDatabase>(); With.Mocks(Mocks).Expecting(delegate{ Expect.Call(database.ConnectionTerminated()).Return(true); ).Verify(delegate{ database.connectionterminated(); ); Listing 11: Test mit With 5.13 Weitere Möglichkeiten und Funktionen Im Weiteren wird noch ein kleiner Überblick gegeben, welche Möglichkeiten RhinoMocks noch bietet. Diese sind nur kurz aufgeführt, weil deren genaue Erläuterung zu tief gehen würde. Hier wird auf die umfangreiche Dokumentation verwiesen. 5.13.1 Generelles RhinoMocks bietet eine große Anzahl von Constraints und Methodenoptionen wie zum Beispiel 'LastCall' (arbeitet auf dem letzten aufgerufenen Mock-Objekt). Diese sind meist sehr intuitiv, da die Namen für sich selbst sprechen. Details lassen sich in der Dokumentation und der API (http://www.ayende.com/projects/rhino-mocks/api/files/mockrepository-cs.html ) finden. 5.13.2 Events Es wird die Möglichkeit angeboten, dass sich die zu testende Klasse an einem Event eines gemockten Interfaces anmeldet und zu überprüfen, ob dieses auch wirklich geschehen ist. 13

5.13.3 Properties Das Setzen von gettern/settern bei Mock-Objekten kann recht lang werden. Dieses lässt sich automatisieren, indem man an den erwarteten Aufruf einfach.propertybehavior() hängt. Damit simuliert RhinoMocks einfaches Verhalten von Variablen. 5.13.4 Callbacks Mit Callbacks wird eine Möglichkeit geboten, RhinoMocks den Benutzer zu fragen, ob der Aufruf einer Methode in diesem Kontext wirklich erwartet wird. Der Benutzer muss verifizieren, dass der Aufruf an diesem Punkt beabsichtig wirklich war. Dieses scheint eine sehr mächtige, aber auch nicht ganz ungefährliche Methode zusein. Es wird hier empfohlen die Dokumentation zu lesen und/oder den Autor näher zu fragen, wenn man diese Methode sinnvoll einsetzen möchte. 5.13.5 Do-Handler Der Do-Handler ergänzt einen Methodenaufruf. Wird ein erwarteter Aufruf einer Methode durchgeführt, wird auch der Do-Handler ausgeführt. Syntax : '.Do(new delegatemethode(parameter))' 14

6 Quellen und hilfreiche Links Hauptseite: http://www.ayende.com/projects/rhino-mocks.aspx Dokumentation : http://www.ayende.com/wiki/rhino+mocks.ashx Download: http://www.ayende.com/projects/rhino-mocks/downloads.aspx Video-Tutorial: http://www.ayende.com/hibernating-rhinos.aspx Void-Methode-mit-Parameter-Problem: http://ayende.com/blog/archive/2007/10/27/using- Expect.Call-void-method.aspx 15