Metodo statico fittizio utilizzando JMockit

1. Panoramica

Alcune famose librerie di mocking come Mockito e Easymock generano mock-up sfruttando il modello di classe basato sull'ereditarietà di Java. EasyMock implementa un'interfaccia in fase di esecuzione, mentre Mockito eredita dalla classe di destinazione per creare uno stub mocking .

Nessuno dei due approcci funziona bene per i metodi statici poiché i metodi statici sono associati a una classe e non possono essere sovrascritti. Tuttavia, JMockit fornisce funzionalità di derisione del metodo statico.

In questo tutorial, esploreremo alcune di queste funzionalità.

Per un'introduzione a JMockit, vedere il nostro articolo precedente.

2. Dipendenze di Maven

Cominciamo con le dipendenze di Maven:

 org.jmockit jmockit 1.24 test 

Puoi trovare le ultime versioni di queste librerie su Maven Central.

3. Metodo statico chiamato da metodo non statico

Innanzitutto, consideriamo un caso in cui abbiamo una classe con un metodo non statico che dipende internamente dal metodo statico :

public class AppManager { public boolean managerResponse(String question) { return AppManager.isResponsePositive(question); } public static boolean isResponsePositive(String value) { if (value == null) { return false; } int length = value.length(); int randomNumber = randomNumber(); return length == randomNumber ? true : false; } private static int randomNumber() { return new Random().nextInt(7); } }

Ora, vogliamo testare il metodo managerResponse (). Poiché il suo valore di ritorno dipende da un altro metodo, dobbiamo prendere in giro il metodo isResponsePositive () .

Possiamo deridere questo metodo statico usando la classe anonima mockit.MockUp.MockUp di JMockit ( dove T sarà il nome della classe ) e l' annotazione @Mock :

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

Qui, stiamo prendendo in giro isResponsePositive () con un valore di ritorno che vorremmo usare per il test. Pertanto, verificare il risultato previsto utilizzando l' utility Assertions disponibile in Junit-5.

4. Prova il metodo statico privato

In alcuni casi, altri metodi utilizzano metodi statici privati ​​della classe:

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

Per testare tale metodo, avremmo bisogno di simulare il metodo statico privato . Possiamo usare il metodo di utilità Deencapsulation.invoke () fornito da JMockit :

@Test public void givenAppManager_whenPrivateStaticMethod_thenValidateExpectedResponse() { int response = Deencapsulation.invoke(AppManager.class, "stringToInteger", "110"); assertEquals(110, response); }

Come suggerisce il nome, il suo scopo è de-incapsulare lo stato di un oggetto. In questo modo, JMockit semplifica i metodi di test che non potrebbero essere testati altrimenti.

5. conclusione

In questo articolo, abbiamo visto come i metodi statici possono essere derisi usando JMockit . Per uno sguardo più approfondito ad alcune delle funzionalità avanzate di JMockit, dai un'occhiata al nostro articolo sull'utilizzo avanzato di JMockit.

Come al solito, il codice sorgente completo per questo tutorial è disponibile su GitHub.