Mock Static Method met behulp van JMockit

1. Overzicht

Sommige populaire mocking-bibliotheken zoals Mockito en Easymock genereren mock-ups door gebruik te maken van Java's op overerving gebaseerde klassemodel. EasyMock implementeert een interface tijdens runtime, terwijl Mockito erft van de doelklasse om een ​​spotstomp te maken.

Geen van beide benaderingen werkt goed voor statische methoden, aangezien statische methoden aan een klasse zijn gekoppeld en niet kunnen worden overschreven. Echter, JMockit biedt een statische methode voor het bespotten van functies.

In deze zelfstudie verkennen we enkele van deze functies.

Zie ons vorige artikel voor een inleiding tot JMockit.

2. Maven afhankelijkheden

Laten we beginnen met Maven-afhankelijkheden:

 org.jmockit jmockit 1.24 test 

U kunt de nieuwste versies van deze bibliotheken vinden op Maven Central.

3. Statische methode genoemd vanuit niet-statische methode

Laten we eerst eens kijken naar een geval dat we hebben een klasse met een niet-statische methode die intern afhankelijk is van de statische methode:

openbare klasse AppManager {openbare booleaanse managerResponse (String-vraag) {terug AppManager.isResponsePositive (vraag); } openbare statische boolean isResponsePositive (String-waarde) {if (waarde == null) {return false; } int lengte = waarde.length (); int randomNumber = randomNumber (); return length == randomNumber? waar onwaar; } private static int randomNumber () {retourneer nieuwe Random (). nextInt (7); }}

Nu willen we de methode testen managerResponse (). Omdat de geretourneerde waarde afhangt van een andere methode, moeten we de isResponsePositive () methode.

We kunnen deze statische methode bespotten met JMockit's anonieme klas mockit.MockUp.MockUp (waarbij T de klassenaam is) en @Bespotten annotatie:

@Test openbare ongeldig gegevenAppManager_whenStaticMethodCalled_thenValidateExpectedResponse () {nieuwe MockUp () {@Mock openbare boolean isResponsePositive (String-waarde) {return false; }}; assertFalse (appManager.managerResponse ("Some string ...")); }

Hier bespotten we de isResponsePositive () met een retourwaarde die we voor de test willen gebruiken. Controleer daarom het verwachte resultaat met Beweringen hulpprogramma beschikbaar in Junit-5.

4. Test de privé statische methode

In een paar gevallen gebruiken andere methoden private statische methoden van de klasse:

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

Voor het testen van een dergelijke methode, we zouden de privé statische methode moeten bespotten. We kunnen de Deencapsulation.invoke () utility-methode geleverd door JMockit:

@Test openbare ongeldig gegevenAppManager_whenPrivateStaticMethod_thenValidateExpectedResponse () {int response = Deencapsulation.invoke (AppManager.class, "stringToInteger", "110"); assertEquals (110, antwoord); }

Zoals de naam doet vermoeden, is het doel om de-inkapselen de toestand van een object. Op deze manier vereenvoudigt JMockit testmethoden die anders niet zouden kunnen worden getest.

5. Conclusie

In dit artikel hebben we gezien hoe statische methoden kunnen worden bespot met JMockit. Voor een meer diepgaande blik op enkele van de geavanceerde functies van JMockit, bekijk ons ​​JMockit Advanced Usage-artikel.

Zoals gewoonlijk is de volledige broncode voor deze tutorial beschikbaar op GitHub.


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