Mock Statisk metode ved hjælp af JMockit

1. Oversigt

Nogle populære mocking-biblioteker som Mockito og Easymock genererer mock-ups ved at drage fordel af Java's arvebaserede klassemodel. EasyMock implementerer en grænseflade ved kørsel, mens Mockito arver fra målklassen for at oprette en spottende stub.

Ingen af ​​metoderne fungerer godt for statiske metoder, da statiske metoder er knyttet til en klasse og ikke kan tilsidesættes. Imidlertid, JMockit giver en statisk metode spottende funktioner.

I denne vejledning undersøger vi nogle af disse funktioner.

For en introduktion til JMockit, se vores tidligere artikel.

2. Maven-afhængigheder

Lad os starte med Maven-afhængigheder:

 org.jmockit jmockit 1.24 test 

Du kan finde de nyeste versioner af disse biblioteker på Maven Central.

3. Statisk metode kaldet fra ikke-statisk metode

Lad os først overveje en sag, når vi har det en klasse med en ikke-statisk metode, der internt afhænger af den statiske metode:

offentlig klasse AppManager {offentlig boolsk managerResponse (streng spørgsmål) {return AppManager.isResponsePositive (spørgsmål); } public static boolean isResponsePositive (String value) {if (value == null) {return false; } int længde = værdi. længde (); int randomNumber = randomNumber (); returlængde == randomNumber? sandt falsk; } private static int randomNumber () {return new Random (). nextInt (7); }}

Nu vil vi teste metoden managerResponse (). Da returværdien afhænger af en anden metode, skal vi spotte isResponsePositive () metode.

Vi kan spotte denne statiske metode ved hjælp af JMockits anonym klasse mockit.MockUp.MockUp (hvor T vil være klassens navn) og @Mock kommentar:

@Test offentlig ugyldighed givetAppManager_whenStaticMethodCalled_thenValidateExpectedResponse () {new MockUp () {@Mock public boolean isResponsePositive (String value) {return false; }}; assertFalse (appManager.managerResponse ("Nogle streng ...")); }

Her narrer vi af isResponsePositive () med en returværdi, som vi gerne vil bruge til testen. Kontroller derfor det forventede resultat ved hjælp af Påstande værktøj tilgængelig i Junit-5.

4. Test privat statisk metode

I nogle få tilfælde bruger andre metoder private statiske metoder i klassen:

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

Til afprøvning af en sådan metode vi bliver nødt til at spotte privat statisk metode. Vi kan bruge Deencapsulation.invoke () hjælpemetode leveret af JMockit:

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

Som navnet antyder, er formålet at afkapsling et objekts tilstand. På denne måde forenkler JMockit testmetoder, der ellers ikke kunne testes.

5. Konklusion

I denne artikel har vi set, hvordan statiske metoder kan bespottes ved hjælp af JMockit. For et mere dybtgående kig på nogle af de avancerede funktioner i JMockit, se på vores artikel JMockit Advanced Usage.

Som sædvanlig er den fulde kildekode til denne vejledning tilgængelig på GitHub.