Mocken von Konstruktoren mit JMockit
Beim Testen mit JMockit bin ich noch auf ein Problem gestossen, das mich eine Zeit lang beschäftigt hat: Wie kann man einen Konstruktor einer Klasse mocken?
Die Dokumentation von JMockit geht darauf nicht speziell ein. Dies liegt wohl daran, dass die Lösung ganz einfach ist. Wenn man aber nicht darauf kommt, nutzt einem dies nichts.
Ganze Klassen mocken
Mockt man ganze Klassen bekommt man das Mocken des Konstruktors gratis dazu. Dazu genügt eine einfache Klasse wie MockedFileOutputStream. Der dazugehörige Test ist sehr einfach:
Erneut dient redefineMethods() zum "umhängen" der aufgerufenen Klassen/Methode. Genau wie bei den Methoden funktioniert es auch beim Konstruktor.
Mocken eines statischen Initialisierungsblocks
Ein statischer Initialisierungsblock (static initialization block) ist ein gewöhnlicher Code-Block der mit {} eingeschlossen wird und als static markiert ist. Dieser Block wird vom Klassenlader beim laden der entsprechenden Klasse ausgeführt. Mehr Informationen dazu gibt es in der Insel und bei SUN. Solche Blöcke können mit JMockit durch das überschreiben der Methode $clinit() ersetzt werden. (Die Annotationen @Mock und @MockClass sind für die korrekte Ausführung nötig.)
Um solche Blöcke zu mocken braucht es die Methode setUpMocks(). Diese macht im wesentlichen das gleiche wie redefineMethods(), prüft aber auf eine andere Art welches die Mock-Objekte sind. (Siehe API)
Neue Webseite von JMockit
Anfangs Dezember ist JMockit zu Google Code umgezogen. Die neue URL ist https://jmockit.googlecode.com.
Zum Weiterlesen
Im Blog von Dhruba Bandopadhyay fand ich den interessanten Eintrag "JMockit: No holds barred testing with instrumentation over mocking". Dies ist die beste Zusammenfassung zu JMockit die ich bisher ausserhalb der offiziellen Doku gefunden habe.
Wie man Methoden mit JMockit mockt habe ich hier beschrieben.