Was ist der Unterschied zwischen @Mock
und @InjectMocks
im Mockito-Framework?
@Mock
erzeugt ein Mock. @InjectMocks" erzeugt eine Instanz der Klasse und injiziert die Mocks, die mit den @Mock
(oder @Spy
) Annotationen erzeugt wurden, in diese Instanz.
Beachten Sie, dass Sie @RunWith(MockitoJUnitRunner.class)
oder Mockito.initMocks(this)
verwenden müssen, um diese Mocks zu initialisieren und sie zu injizieren.
@RunWith(MockitoJUnitRunner.class)
public class SomeManagerTest {
@InjectMocks
private SomeManager someManager;
@Mock
private SomeDependency someDependency; // this will be injected into someManager
//tests...
}
Die Annotation "@Mock" spiegelt das betreffende Objekt wider.
Die Annotation @InjectMocks
ermöglicht es, die verschiedenen (und relevanten) Mocks, die von @Mock
erstellt wurden, in das zugrunde liegende Objekt zu injizieren.
Beide sind komplementär.
Ein "Mocking-Framework", auf dem Mockito basiert, ist ein Framework, das Ihnen die Möglichkeit gibt, Mock-Objekte zu erstellen (in alten Begriffen könnte man diese Objekte als Shunts bezeichnen, da sie als Shunts für abhängige Funktionen dienen). Mit anderen Worten, ein Mock-Objekt wird verwendet, um das reale Objekt zu imitieren, von dem Ihr Code abhängt, Sie erstellen ein Proxy-Objekt mit dem Mocking-Framework. Durch die Verwendung von Mock-Objekten in Ihren Tests gehen Sie im Wesentlichen von normalen Unit-Tests zu Integrationstests über.
Mockito ist ein quelloffenes Test-Framework für Java, das unter der MIT-Lizenz veröffentlicht wurde. Es handelt sich um 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, aber im Wesentlichen gibt es zwei Haupttypen von Mock-Objekt-Frameworks: solche, die über Proxy implementiert werden, und solche, die über Klassenremapping implementiert werden.
Mit Dependency-Injection-Frameworks wie Spring können Sie Ihre Proxy-Objekte injizieren, ohne den Code zu ändern. Das Mock-Objekt erwartet, dass eine bestimmte Methode aufgerufen wird, und gibt ein erwartetes Ergebnis zurück.
Die Annotation @InjectMocks
versucht, die Instanz des Testobjekts zu instanziieren und injiziert Felder, die mit @Mock
oder @Spy
annotiert sind, in private Felder des Testobjekts.
Der Aufruf MockitoAnnotations.initMocks(this)
setzt das Testobjekt zurück und initialisiert die Mocks neu. Denken Sie also daran, dies in Ihrer @Before
/ @BeforeMethod
-Annotation vorzusehen.