Mock wird nicht angewendet auf neues Objekt erstellen
Ich versuchte, mich zu verspotten, ein neues Objekt erstellen
public class MyServiceTest {
MyClass myClass;
myClass = Mockito.mock(MyClass.class);
Mockito.when(new MyClass()).thenReturn(myClass);
}
Fehler:
org.mockito.exceptions.misusing.MissingMethodInvocationException:
when() requires an argument which has to be 'a method call on a mock'.
For example:
when(mock.getArticles()).thenReturn(articles);
Also, this error might show up because:
1. you stub either of: final/private/equals()/hashCode() methods.
Those methods *cannot* be stubbed/verified.
Mocking methods declared on non-public parent classes is not supported.
2. inside when() you don't call method on mock but on some other object.
Habe ich verspotte die myClass-Objekt, aber es ist immer zugeordnet, um ein neues Objekt über den Aufruf der Methode:
public class MyService {
public static String myMethod(){
MyClass myClass = new MyClass();
//..........
}
}
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ersten: ich empfehle, nicht zu verwenden, PowerMock. Wie mit diesem Rahmen führt oft zu bizarren Fehlern, und: Sie müssen verstehen, dass Sie nicht vor einem "Mangel" von Mockito ... aber ein Mangel in Ihrem design.
Im Grunde wollen Sie lernen, mit dependency injection. Die ganze Idee ist: Sie müssen nicht anrufen, neue in Ihrem Produktionscode. Da können Sie nicht verspotten Aufruf von "new". Stattdessen schieben Sie die Objekte, die Ihre Produktions-code muss ... in Ihre Klassen.
Für normal (Produktion) arbeiten, drücken Sie in normale Objekte; und für unit-Tests, drücken Sie verspottet Objekte.
In anderen Worten: wenn Sie herausfinden, dass Ihr design erfordern würde, PowerMock, um geprüft zu werden; dann erzählt Sie, dass Ihr design muss überarbeitet werden.
Dies ist das richtige Verhalten; Mockito nicht unterstützt spöttischen neues Objekt erstellen. Sie benötigen eine andere Bibliothek, wie PowerMock für das, oder müssen Sie umgestalten test.
Lernen, ein wenig mehr über jeden Teil des Mockito-based test:
mock
erstellt ein mock-Objekt. Beachten Sie, dass Sie die Einstellung nicht den Erwartungen, die auf alle Instanzen von MyObject; stattdessen erstellen Sie eine einzelne Instanz zu kontrollieren. Intern, das ist eigentlich ein one-off-Unterklasse des MyObject-mit all seinen Methoden überschrieben, so Mockito ist nur wirklich gut für sichtbaren, nicht-Letzte Instanz-Methoden (das könnte man überschreiben sich).Können Sie die
when
Aufruf stub Verhalten. Die einzige Sache, die gehen, insidewhen
ist ein einzigen Aufruf einer Methode auf einem Mockito-erstellt mock, so dass Ihrenew
Schlüsselwort funktioniert hier nicht.Wieder, weil Sie nicht verwenden können
new
werden Sie müssen in der Regel legen Sie Ihre mock in Ihrem system unter test. Sie (fast) nie verspotten das system under test; du bist der Spott der Mitarbeiter statt, und da Sie nicht verwenden könnennew
Sie haben in der Regel zu passieren in. Dies ist Teil der warum Mockito so gut funktioniert mit dependency injection Systeme.Dann rufen Sie Ihre Methode-unter-test...
...und überprüfen Sie, dass der endgültige Zustand ist, was Sie wollen, es zu sein. Dies kann Behauptungen wie
assertEquals
von einem test-framework, Anrufe zuverify
mit Mockito-mocks erstellt, oder eine Kombination der beiden.Denken Sie daran, mit nur Mockito, werden Sie nicht in der Lage, Java-Rückkehr ein mock beim Aufruf
new
, so müssen Sie einen Schritt wie Schritt 3 oben. Alternativ PowerMock ist eine Erweiterung Bibliothek für EasyMock oder Mockito, die statische Methoden wiewhenNew
undmockStatic
für fortgeschrittene spöttisch. (Ein Wort der Vorsicht, obwohl: Da PowerMock verwendet einen speziellen classloader zu überschreiben Ihre Klassen, es kann sehr schwierig sein, einzurichten, und Ihre Magie können Sie Ihre tests härter zu Grunde geht. Refactoring kann einen besseren Weg, um Ihre tests verständlich.)MyClass myClass; myClass = Mockito.mock(MyClass.class); whenNew(MyClass.class).withNoArguments() .thenReturn(myClass );
Aber noch immer nur das neue Objekt inMyService.myMethod()
Können Sie versuchen, powermock. Es funktionierte für mich.