Mocking ein Klasse-Objekt mit Mockito und PowerMockito
Ist es möglich, zu verhöhnen, ein Klasse-Objekt mit Mockito und/oder PowerMockito?
Etwas wie:
Class<Runnable> mockRunnableClass = mock(Class<Runnable>.class);
Ja... Das sagt mir, wie zum Hohn eine Finale Klasse, aber es doens ' T mir, wie zum Hohn der Klasse object.
Java generics verwenden, geben Sie die Löschung, so
Was ist Ihre Nutzung Fall, dass Sie wollen, zu verspotten "Klasse"? Klasse ist ziemlich Häufig - einfach nur neugierig.
Was dann passiert, wenn Ihr Test zeigt einen Fehler? Sie sind nicht erlaubt, es zu beheben?
Ich behaupte nicht, dass die Dokumentation sagt ja, tut es. Ich war zu zitieren. Mockito ist nicht dazu da, zu unterstützen, teilweise spöttisch. Auch habe ich nie gesagt, ich konnte es nicht ändern, der code, um einen Fehler zu beheben. Die Behebung des Fehlers und änderung einer Klasse Schnittstelle sind zwei sehr verschiedene Dinge. Die zweite schlägt in jedem Benutzer der Klasse und zwingt Sie zu umschreiben, die Ihren code. Sie nicht wissen, den vollständigen Kontext von dem, was ich Tue, also bitte nicht abtun mir, wenn ich sage refactoring ist keine option.
Java generics verwenden, geben Sie die Löschung, so
Class<Runnable>.class
ist falsch. Class
ist final
, aber Sie verwenden können, PowerMock sowieso.Was ist Ihre Nutzung Fall, dass Sie wollen, zu verspotten "Klasse"? Klasse ist ziemlich Häufig - einfach nur neugierig.
Was dann passiert, wenn Ihr Test zeigt einen Fehler? Sie sind nicht erlaubt, es zu beheben?
Ich behaupte nicht, dass die Dokumentation sagt ja, tut es. Ich war zu zitieren. Mockito ist nicht dazu da, zu unterstützen, teilweise spöttisch. Auch habe ich nie gesagt, ich konnte es nicht ändern, der code, um einen Fehler zu beheben. Die Behebung des Fehlers und änderung einer Klasse Schnittstelle sind zwei sehr verschiedene Dinge. Die zweite schlägt in jedem Benutzer der Klasse und zwingt Sie zu umschreiben, die Ihren code. Sie nicht wissen, den vollständigen Kontext von dem, was ich Tue, also bitte nicht abtun mir, wenn ich sage refactoring ist keine option.
InformationsquelleAutor LandonSchropp | 2012-08-29
Du musst angemeldet sein, um einen Kommentar abzugeben.
Alternative zum mocking-Klasse möglicherweise die Verwendung einer Fabrik statt. Ich weiß, Sie sind besorgt über die Umgestaltung, aber dies getan werden könnte, ohne dass sich die öffentliche API der Klasse. Sie haben nicht viel code zu verstehen, die Klasse, die Sie versuchen zu testen, aber hier ein Beispiel für ein refactoring-ohne änderung der API. Es ist eine triviale Klasse, aber es könnte Ihnen eine Idee geben.
Natürlich die einfachste Sache zu tun, um dies zu testen trivial Klasse wäre, eine echte Runnable-Klasse, aber wenn Sie versucht haben, zu verhöhnen, der Klasse, führen Sie in die Probleme, die du hast. So könnten Sie umgestalten es so:
Nun Instantiator tut genau das (trivial einfach ist), was es vorher getan hat, mit dem gleichen public API und keine Notwendigkeit für einen client der Klasse zu tun, einer speziellen Injektion von Ihren eigenen. Allerdings, wenn Sie wollte, zu verspotten die factory-Klasse und injizieren es, das ist sehr einfach zu tun.
InformationsquelleAutor jhericks
warum nicht mit einem Agenten, wenn Sie können nicht umgestalten, den code gibt es nicht viele Optionen, da @jherics wissen, java-Klassen geladen werden, die durch den bootstrap-classloader und powermock kann nicht neu definieren, deren bytecode.
Jedoch Powermock jetzt coms mit einem Agenten, dass es system-Klassen mock. Überprüfen Sie hier für die ausführliche Erklärung.
Die Hauptidee ist, ändern Sie Ihre java-Befehl und fügen Sie hinzu :
Die grundlegende Sache, die dieser agent tut, ist zu definalize Klassen, damit zukünftig die Verspottung, die in einem bestimmten test, das ist, warum Sie benötigen, um bestimmte Arten zu kommunizieren mit dem Agenten, zum Beispiel mit JUnit :
TestNG wird ebenfalls unterstützt. Prüfen Sie einfach die wiki-Seite für weitere Informationen.
Hoffe, das hilft.
InformationsquelleAutor Brice
Erste, wie gesagt in den Kommentaren, die Sie würde tun müssen:
Aber das funktioniert nicht in der üblichen Weise aufgrund der Einschränkungen mit PowerMock. Man kann nicht einfach mock-Klassen aus java.lang, java.net, java.io oder andere system-Klassen, da sind Sie geladen von Java bootstrap-classloader und nicht byte-code-Manipulation durch PowerMock classloader. (Siehe PowerMock FAQ #4.) Wie von PowerMock 1.2.5, Sie können arbeiten, um dieses. Wenn die Klasse, die Sie testen wollte, war dies:
Dann würden Sie dies tun:
PowerMockito.mock(Class.class)
-, test-runner, wird eine Instanz vonIllegalAccessError
.Ich wollte eigentlich nicht testen, so ist es möglich, dass
Class
ist zu fundamental, zu verspotten. Welche version von PowerMock verwenden Sie?1.4.10 glaube ich. Ich fürchte, Sie könnten Recht haben. Dies könnte einer der Fälle, wo es einfach nicht möglich sauber testen Sie den code.
InformationsquelleAutor jhericks
Wie über dieses. erstellen Sie eine get-Methode, der hat ein Objekt (MS) in der Klasse PCService und dann mock.
InformationsquelleAutor Mike