Forskjellen mellom @Mock og @InjectMocks

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...

}
Kommentarer (5)

@Mock-annotasjonen etterligner det aktuelle objektet.

Annotasjonen @InjectMocks gjør det mulig å injisere de ulike (og relevante) mockene som er opprettet av @Mock i det underliggende objektet.

**Begge er komplementære.

Kommentarer (4)

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.

Kommentarer (1)