ich schaue mich gerade nach einem Mocking Framework f�r C++ um.
Hat jemand von euch Erfahrung mit Mocking Frameworks zur Verwendung
in Unit-Tests unter C++ gemacht? Wenn ja, welche Frameworks habt ihr
verwendet?
Gibt es so etwas �hnliches wie Mockito, JMock oder EasyMock (aus
der Java-Welt)?
Als kleines Schmankerl sollte das Ganze dann auch noch unter
Microsoft eMbedded Visual C++ 4.0 integrierbar sein, eine
Kommandozeilenversion w�rde mir f�r den Anfang aber gen�gen.
Gru�,
Georg Fleischer
Im Allgemeinen m�chte ich, wenn ich an der getesteten Schnittstelle
Funktion A aufrufe, sehen, dass mein getestetes Modul Funktion B am Mock
aufruft. Dazu braucht man sowieso eigenen Code im Mock. Der hinterl�sst
dann Spuren, der vom UnitTester abgefragt wird. Wie macht das ein
Framework automatisch?
> Als kleines Schmankerl sollte das Ganze dann auch noch unter
> Microsoft eMbedded Visual C++ 4.0 integrierbar sein, eine
> Kommandozeilenversion w�rde mir f�r den Anfang aber gen�gen.
Da ich eh nur ein headless device hatte, kam f�r mich sowieso nur eine
Kommandozeilenversion in Frage.
Gru�,
Helge
Mit einem Mocking Framework wird von einem Typ (Interface oder Klasse)
eine Mocking-Instanz erstellt. Die ungef�hre Funktionsweise in Java mit
dem Mocking Framework Mockito ist folgende:
// Erstellen einer neuen Liste
List mock = mock(List.class);
someCodeThatInteractsWithMock();
// Sicherstellen, dass die Methode "clear" dreimal aufgerufen wurde
verify(mock, times(3)).clear();
// Sicherstellen, dass die Methode "add" mindest einmal aufgerufen wurde
verify(mock, atLeastOnce()).add(anyObject());
Oder folgendes Beispiel, wo eine Exception geworfen wird, falls auf
dem Mock-Object w�hrend des Tests die Methode "clear" aufgerufen wurde:
List mock = mock(List.class);
doThrow(new RuntimeException()).when(mock).clear();
Das tolle daran ist, dass man sich die komplizierten Mock-Objects
nicht selber schreiben muss und die Mocks f�r jeden Testfall
individuell initialisieren kann. Ansonsten musste man sich Mock-
Objects mit irgendwelchen behelfsm��igen boolean flags oder countern
selber schreiben, aber das entf�llt mit einem Mocking Framework.
Vern�nftiges Unit-Testing ohne Mock-Objects kann ich mir ehrlich gesagt
gar nicht mehr vorstellen, deshalb suche ich ja nach einer L�sung f�r
C++.
Gru�,
Georg Fleischer
Gruß,
Michael Karcher
1. Mockpp
Pro: Erprobt (seit 2005 in der Entwicklung)
Contra: Es müssen eigene Mock-Klassen manuell erstellt werden.
Link: http://mockpp.sourceforge.net/
2. Mockcpp
Sehr starkes pro: Es müssen keine eigenen Mock-Klassen erstellt werden.
Contra: Das Projekt ist erst seit Anfang September zugänglich.
Link: http://code.google.com/p/mockcpp/
3. googlemock
Pro: Standardisiertes Mocking Framework von Google, Weit verbreitet
Contra: Bestimmte Voraussetzungen für Compiler notwendig:
- Google Mock depends on advanced C++ features and thus requires a more
modern compiler. It has been tested with gcc 4.0+ on Linux and Mac OS X,
and Microsoft Visual C++ 8.0 SP1 on Windows. Users reported that it also
works with gcc 3.4 and Cygwin, although we haven't tested it there
ourselves.
Link: http://code.google.com/p/googlemock/
Die Variante, die ich bisher als interessanteste ansehe ist Nr. 2 -
Mockcpp. Die intuitive On-The-Fly erstellung von Mock-Objects sieht sehr
einfach aus. Ich werde es demnächst für Einprojekt einsetzen und danach
meine Erfahrungen mit dem Framework posten.
Michael Karcher wrote:
>> // Erstellen einer neuen Liste
>> List mock = mock(List.class);
> Und damit hast Du ein Problem in C++. Das sieht doch sehr nach Reflection
> aus, was in C++ für nicht speziell darauf vorbereitete Klassen nicht
geht.
Nach Sichtung der oben genannten Projekte scheint es doch Wege und
Möglichkeiten zu geben, was die Erstellung von Mock-Objects ohne
konkrete Vorbereitung der Klassen angeht.
Gruß,
Georg
Vielleicht ist Google's gmock f�r Dich interessant [0, 1].
Es bietet wie Java's Mockito auch ein Fluent-Interface-Stil an.
Ciao
Martin
[0] http://code.google.com/p/googlemock/
[1]
http://www.bestechvideos.com/2009/03/20/c-mocks-made-easy-an-introduction-to-gmock