Hva er forskjellen mellom @Mock
og @InjectMocks
i Mockito-rammeverket?
@Mock
oppretter en mock. @InjectMocks
oppretter en forekomst av klassen og injiserer mocks som er opprettet med @Mock
(eller @Spy
) annotasjonene i denne forekomsten.
Merk at du må bruke @RunWith(MockitoJUnitRunner.class)
eller Mockito.initMocks(this)
for å initialisere disse mockene og injisere dem.
@RunWith(MockitoJUnitRunner.class)
public class SomeManagerTest {
@InjectMocks
private SomeManager someManager;
@Mock
private SomeDependency someDependency; // this will be injected into someManager
//tests...
}
Et "mocking framework", som Mockito er basert på, er et rammeverk som gir deg muligheten til å lage Mock-objekter (i gamle dager kunne disse objektene kalles shunts, da de fungerer som shunts for avhengig funksjonalitet). Med andre ord, et mock-objekt brukes til å imitere det virkelige objektet som koden din er avhengig av, du lager et proxy-objekt med mocking-rammeverket. Ved å bruke mock-objekter i testene dine går du fra vanlig enhetstesting til integrasjonstesting.
Mockito er et testrammeverk med åpen kildekode for Java som er utgitt under MIT-lisensen. Det er et "mocking"-rammeverk som lar deg skrive flotte tester med et rent og enkelt API. Det finnes mange forskjellige mocking-rammeverk i Java, men det er i hovedsak to hovedtyper av mock-rammeverk, de som implementeres via proxy og de som implementeres via class remapping.
Med rammeverk for avhengighetsinjeksjon, som Spring, kan du injisere proxy-objekter uten å endre koden. Mock-objektet forventer at en bestemt metode skal kalles og returnerer et forventet resultat.
Annotasjonen @InjectMocks
forsøker å instansiere testobjektet og injiserer felter annotert med @Mock
eller @Spy
i private felter i testobjektet.
MockitoAnnotations.initMocks(this)
-kallet tilbakestiller testobjektet og initialiserer mocks på nytt, så husk å ha dette i @Before
/ @BeforeMethod
-annotasjonen.