Mock Static Method ved bruk av JMockit

1. Oversikt

Noen populære hånebiblioteker som Mockito og Easymock genererer mock-ups ved å dra nytte av Java's arvbaserte klassemodell. EasyMock implementerer et grensesnitt ved kjøretid, mens Mockito arver fra målklassen for å lage en spottende stubbe.

Ingen av tilnærmingene fungerer bra for statiske metoder, siden statiske metoder er knyttet til en klasse og ikke kan overstyres. Derimot, JMockit gir en statisk metode spottende funksjoner.

I denne opplæringen vil vi utforske noen av disse funksjonene.

For en introduksjon til JMockit, se vår forrige artikkel.

2. Maven-avhengigheter

La oss starte med Maven-avhengigheter:

 org.jmockit jmockit 1.24 test 

Du finner de nyeste versjonene av disse bibliotekene på Maven Central.

3. Statisk metode kalt fra ikke-statisk metode

La oss først vurdere en sak når vi har det en klasse med en ikke-statisk metode som internt avhenger av statisk metode:

offentlig klasse AppManager {offentlig boolsk managerResponse (streng spørsmål) {return AppManager.isResponsePositive (spørsmål); } offentlig statisk boolsk isResponsePositive (strengverdi) {if (value == null) {return false; } int lengde = verdi.lengde (); int randomNumber = randomNumber (); returlengde == randomNumber? sant: falsk; } private static int randomNumber () {return new Random (). nextInt (7); }}

Nå vil vi teste metoden managerResponse (). Siden returverdien avhenger av en annen metode, må vi spotte isResponsePositive () metode.

Vi kan spotte denne statiske metoden ved hjelp av JMockits anonym klasse mockit.MockUp.MockUp (hvor T vil være klassens navn) og @Håne kommentar:

@Test public void givenAppManager_whenStaticMethodCalled_thenValidateExpectedResponse () {new MockUp () {@Mock public boolean isResponsePositive (String value) {return false; }}; assertFalse (appManager.managerResponse ("Noe streng ...")); }

Her spotter vi isResponsePositive () med en returverdi som vi ønsker å bruke til testen. Kontroller derfor forventet resultat ved hjelp av Påstander verktøy tilgjengelig i Junit-5.

4. Test privat statisk metode

I noen få tilfeller bruker andre metoder private statiske metoder i klassen:

private static Integer stringToInteger (String num) {return Integer.parseInt (num); }

For å teste en slik metode, vi trenger å spotte privat statisk metode. Vi kan bruke Deencapsulation.invoke () verktøymetoden levert av JMockit:

@Test offentlig ugyldighet gittAppManager_whenPrivateStaticMethod_thenValidateExpectedResponse () {int respons = Deencapsulation.invoke (AppManager.class, "stringToInteger", "110"); assertEquals (110, respons); }

Som navnet antyder, er det hensikten å de-kapsle inn tilstanden til et objekt. På denne måten forenkler JMockit testmetoder som ellers ikke kunne testes.

5. Konklusjon

I denne artikkelen har vi sett hvordan statiske metoder kan spottes ved hjelp av JMockit. For en mer grundig titt på noen av de avanserte funksjonene i JMockit, ta en titt på vår JMockit Advanced Usage-artikkel.

Som vanlig er hele kildekoden for denne opplæringen tilgjengelig på GitHub.


$config[zx-auto] not found$config[zx-overlay] not found