Mockito Injizieren mock in Spion-Objekt
Schreibe ich einen test für eine Klasse hat eine 2 Ebene von dependency injection. Ich benutze @Spy-Anmerkung für die 1-level-dependency injection-Objekt, und ich würde gerne Spotten die 2. Ebene der Injektion. Allerdings habe ich immer null-Zeiger-Ausnahme auf der 2. Ebene. Gibt es eine Möglichkeit, dass ich Spritzen die mock in den @Spy-Objekt?
public class CarTestCase{
@Mock
private Configuration configuration;
@Spy
private Engine engine;
@InjectMocks
private Car car;
@Test
public void test(){
Mockito.when(configuration.getProperties("")).return("Something");
car.drive();
}
}
public class Car{
@Inject
private Engine engine;
public void drive(){
engine.start();
}
}
public class Engine{
@Inject
private Configuration configuration;
public void start(){
configuration.getProperties(); //null pointer exception
}
}
haben Sie initialisiert mocks mit
Nein, aber wie verhält die sich zu dieser Frage?
gut, dass macht Mockito tun, was er tun soll mit Objekten annotiert
Ich habe versucht, legen Sie die MockitoAnnotations.initmocks(dies) der Beginn der von der test-Funktion, aber es funktioniert immer noch nicht
Hast du auch versuchen, Annotation-Engine mit @InjectMocks?
MockitoAnnotations.initmocks(this)
Nein, aber wie verhält die sich zu dieser Frage?
gut, dass macht Mockito tun, was er tun soll mit Objekten annotiert
@Spy
, @Mock
, @InjectMocks
etc, so dass, wenn Sie dies tun, nach dem Bau der car
verspottet eingefügt werden soll....Ich habe versucht, legen Sie die MockitoAnnotations.initmocks(dies) der Beginn der von der test-Funktion, aber es funktioniert immer noch nicht
Hast du auch versuchen, Annotation-Engine mit @InjectMocks?
InformationsquelleAutor Wildchild | 2017-05-11
Du musst angemeldet sein, um einen Kommentar abzugeben.
Mockito sich nicht durchführen, eine so schwierige Injektionen, da es nicht eine injection-framework. So müssen Sie überarbeiten Ihren code, um es mehr getestet. Es ist leicht getan, indem Sie über constructor injection:
In diesem Fall haben Sie zu behandeln, dem Spott und der Injektion manuell:
funktioniert auf die gleiche. Sie haben nicht nennen Konstruktor explizit, Frühling wird es für Sie tun, wenn Sie in den Spring-Kontext. Darüber hinaus der Bereich der Injektion wird nicht empfohlen, es ist immer besser, auf constructor injection.
InformationsquelleAutor Sergii Bishyr
Habe ich auch gewandert, wie Spritzen, ein mock in einen Spion.
Den folgenden Ansatz wird nicht Arbeit:
Aber das gewünschte Verhalten erreicht werden kann durch eine "hybrid" - Ansatz, bei Verwendung beider annotation und manuelle spöttisch. Folgendes funktioniert einwandfrei:
(
SubjectUnderTest
hier hängtMySpy
, undMySpy
wiederum hängt davon abNeedToBeMocked
).UPD: ich Persönlich denke, dass, wenn Sie zu tun haben, solche Magie zu oft, es könnte ein Zeichen sein, dass es etwas falsch mit dependenicies zwischen den Klassen und es lohnt sich, Sie führen ein wenig refactoring zur Verbesserung der code.
Klar, das funktioniert, aber es scheint zu funktionieren durch "Magie". Ich bin gerne mit zu lösen, meine kurze Sicht ein problem (und von Ihnen positiv bewertet werden), aber ich bekomme das ungute Gefühl, dass diese brechen könnte jederzeit 🙂
ja, dieser Ansatz kann wahrscheinlich brechen in zukünftigen Versionen von Mockito, wenn Sie ändern die Art, wie Sie verspottet und Spione. Um zu sehen, wie das funktioniert, im moment, Sie aufhören können an einen debugger-Haltepunkt in einem
@Test
Methode und schauen, was drin ist einmySpy
variable. Es ist eine Instanz derMySpy
Objekt mit modifizierten Methoden, die Ihr zusätzliche Sachen, und rufen Sie dann die ursprünglichen Methoden. Alle Felder sind immer noch da und injiziert werden kann, indem@InjectMocks
.InformationsquelleAutor Yoory N.
Traf ich auch dieses Problem während der unit-Tests mit Spring-boot-Rahmen, aber ich fand eine Lösung für die Verwendung von @Spy und @InjectMocks
Vorherige Antwort von Yoory N.
Weil InjectMocks müssen-Instanz erstellt, damit die Lösung funktioniert bei mir unter,
NotAMockException
mit der version 2.21.0 von Mockito. Auf ein weiteres Projekt mit alten Mockito 1.10.19 das funktioniert nicht wie erwartet sind -- und die Abhängigkeiten injiziert werden, aber diespy
Feld ist nicht ein richtiger Spion und ich kann nicht Dinge tun, wieMockito.verify(mySpy).someMethodCall();
.InformationsquelleAutor Jack Yang
Ich glaube, ich habe gerade die definitive Antwort. Ich habe versucht, Yoory Ansatz änderte aber die Reihenfolge der Anmerkungen :
Ich gehe davon aus, dass Mockito entsteht zunächst das spotten, und fügt ein Spion. So gibt es keine Notwendigkeit zu instanziieren der MySpy-Objekt.
spy
ist eine echte Mockito Spion und alle Felder werden gespritzt. Aber jetzt ist es nicht injizieren, dieser Spion inSubjectUnderTest
Instanz mit@InjectMocks
(als mein Beispiel) und ich bekomme die NullPointerException, wenn er versucht, call spy Methoden. Getestet auf Mockito 2.21.0. Noch gar keine Vorstellung haben, wie dies zu überwinden.InformationsquelleAutor DavidBu