Was ist der Unterschied zwischen @Mock
und @InjectMocks
im Mockito-Framework?
java
unit-testing
mocking
mockito
user2249972
quelle
quelle
Antworten:
@Mock
schafft einen Schein.@InjectMocks
Erstellt eine Instanz der Klasse und fügt die mit den@Mock
(oder@Spy
) Annotationen erstellten Mocks in diese Instanz ein.Beachten Sie, dass Sie diese Mocks verwenden
@RunWith(MockitoJUnitRunner.class)
oderMockito.initMocks(this)
initialisieren und injizieren müssen.quelle
Dies ist ein Beispielcode, wie
@Mock
und@InjectMocks
funktioniert.Sagen wir, wir haben
Game
undPlayer
Klasse.Wie Sie sehen, muss die
Game
Klasse einePlayer
ausführenattack
.Mockito wird eine Spielerklasse verspotten und ihr Verhalten mit
when
undthenReturn
Methode. Schließlich verwendet@InjectMocks
wird Mockito setzen , dassPlayer
inGame
.Beachten Sie, dass Sie nicht einmal ein
new Game
Objekt erstellen müssen . Mockito wird es für Sie injizieren.Wir werden das gleiche Verhalten auch mit
@Spy
Anmerkungen erhalten. Auch wenn der Attributname unterschiedlich ist.Das liegt daran, dass Mockito die
Type Signature
of Game-Klasse überprüft , diePlayer
und istList<String>
.quelle
In Ihrer Testklasse sollte die getestete Klasse mit Anmerkungen versehen sein
@InjectMocks
. Dies teilt Mockito mit, in welche Klasse Mocks injiziert werden sollen:Von da an können wir angeben, welche spezifischen Methoden oder Objekte innerhalb der Klasse in diesem Fall
SomeManager
durch Mocks ersetzt werden sollen:In diesem Beispiel wird
SomeDependency
innerhalb derSomeManager
Klasse verspottet.quelle
@Mock
Annotation verspottet das betroffene Objekt.@InjectMocks
Mit Annotation können die verschiedenen (und relevanten) Mocks, die von erstellt wurden, in das zugrunde liegende Objekt eingefügt werden@Mock
.Beide ergänzen sich.
quelle
@InjectMocks
, diese Klasse zu konstruieren und sie auch auszuspionieren.Zum Beispiel
Hier benötigen wir die DAO-Klasse für die Serviceklasse. Also verspotten wir es und fügen es in die Serviceklasseninstanz ein. In ähnlicher Weise können im Spring-Framework alle @ Autowired- Beans verspottet werden @Mock in jUnits @InjectMocks in Ihre Bean injiziert werden.
MockitoAnnotations.initMocks(this)
Die Methode initialisiert diese Mocks und injiziert sie für jede Testmethode, sodass sie in der aufgerufen werden musssetUp()
Methode werden muss.Dieser Link enthält ein gutes Tutorial für das Mockito-Framework
quelle
Ein "Mocking Framework", auf dem Mockito basiert, ist ein Framework, mit dem Sie Mock-Objekte erstellen können (in alten Begriffen könnten diese Objekte Shunts genannt werden, da sie als Shunts für abhängige Funktionen fungieren). Mit anderen Worten, ein Mock Objekt wird verwendet, um das reale Objekt zu imitieren, von dem Ihr Code abhängig ist. Sie erstellen ein Proxy-Objekt mit dem Mocking-Framework. Durch die Verwendung von Scheinobjekten in Ihren Tests wechseln Sie im Wesentlichen vom normalen Komponententest zum Integrationstest
Mockito ist ein Open-Source-Testframework für Java, das unter der MIT-Lizenz veröffentlicht wurde. Es ist ein "Mocking-Framework", mit dem Sie schöne Tests mit einer sauberen und einfachen API schreiben können. Es gibt viele verschiedene Mocking-Frameworks im Java-Bereich, es gibt jedoch im Wesentlichen zwei Haupttypen von Mock-Objekt-Frameworks, solche, die über Proxy implementiert werden, und solche, die über Klassen-Remapping implementiert werden.
Abhängigkeitsinjektions-Frameworks wie Spring ermöglichen es Ihnen, Ihre Proxy-Objekte zu injizieren, ohne Code zu ändern. Das Mock-Objekt erwartet, dass eine bestimmte Methode aufgerufen wird, und gibt ein erwartetes Ergebnis zurück.
Die
@InjectMocks
Annotation versucht, die Testobjektinstanz zu instanziieren und fügt mit@Mock
oder@Spy
in private Felder des Testobjekts annotierte Felder ein.MockitoAnnotations.initMocks(this)
Rufen Sie auf, setzen Sie das Testobjekt zurück und initialisieren Sie die Mocks neu. Denken Sie also daran, dies bei Ihrer@Before
/@BeforeMethod
Annotation zu haben.quelle
Ein Vorteil des von @Tom erwähnten Ansatzes besteht darin, dass Sie im SomeManager keine Konstruktoren erstellen müssen und somit die Clients einschränken müssen, um ihn zu instanziieren.
Ob dies eine gute Vorgehensweise ist oder nicht, hängt von Ihrem Anwendungsdesign ab.
quelle
Viele Leute haben hier eine großartige Erklärung über
@Mock
vs gegeben@InjectMocks
. Ich mag es, aber ich denke, unsere Tests und Anwendungen sollten so geschrieben sein, dass wir sie nicht brauchen sollten@InjectMocks
.Referenz zum weiteren Lesen mit Beispielen: https://tedvinke.wordpress.com/2014/02/13/mockito-why-you-should-not-use-injectmocks-annotation-to-autowire-fields/
quelle
@Mock
wird verwendet, um die Referenzen der abhängigen Beans zu deklarieren / zu verspotten, während@InjectMocks
die Bean verspottet wird, für die ein Test erstellt wird.Zum Beispiel:
Test für die Klasse
A
:quelle
Die Annotation @InjectMocks kann verwendet werden, um Scheinfelder automatisch in ein Testobjekt einzufügen.
Im folgenden Beispiel hat @InjectMocks verwendet, um die nachgebildete dataMap in die dataLibrary einzufügen.
quelle
Beachten Sie, dass
@InjectMocks
dies bald veraltet sein wirdund Sie können @avp Antwort folgen und auf verlinken :
quelle
Obwohl die obigen Antworten behandelt wurden, habe ich nur versucht, kleinste Details hinzuzufügen, die mir fehlen. Der Grund dahinter (The Why).
Illustration:
Referenz
quelle