Método estático simulado usando JMockit

1. Información general

Algunas bibliotecas de simulacros populares como Mockito y Easymock generan maquetas aprovechando el modelo de clases basado en herencia de Java. EasyMock implementa una interfaz en tiempo de ejecución, mientras que Mockito hereda de la clase de destino para crear un simulacro.

Ninguno de los enfoques funciona bien para métodos estáticos, ya que los métodos estáticos están asociados con una clase y no se pueden anular. Sin embargo, JMockit proporciona un método estático que simula funciones.

En este tutorial, exploraremos algunas de estas características.

Para obtener una introducción a JMockit, consulte nuestro artículo anterior.

2. Dependencias de Maven

Comencemos con las dependencias de Maven:

 org.jmockit jmockit 1.24 test 

Puede encontrar las últimas versiones de estas bibliotecas en Maven Central.

3. Método estático llamado de método no estático

Primero, consideremos un caso en el que tenemos una clase con un método no estático que depende internamente del método estático :

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); } }

Ahora, queremos probar el método managerResponse (). Dado que su valor de retorno depende de otro método, necesitamos simular el método isResponsePositive () .

Podemos burlarnos de este método estático usando la clase anónima de JMockit mockit.MockUp.MockUp ( donde T será el nombre de la clase ) y la anotación @Mock :

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

Aquí, nos burlamos de isResponsePositive () con un valor de retorno que nos gustaría usar para la prueba. Por lo tanto, se verifica el resultado esperado mediante la utilidad Assertions disponible en Junit-5.

4. Pruebe el método estático privado

En algunos casos, otros métodos utilizan métodos estáticos privados de la clase:

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

Para probar dicho método, necesitaríamos simular el método estático privado . Podemos usar el método de utilidad Deencapsulation.invoke () proporcionado por JMockit :

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

Como sugiere el nombre, su propósito es desencapsular el estado de un objeto. De esta manera, JMockit simplifica los métodos de prueba que no se podrían probar de otra manera.

5. Conclusión

En este artículo, hemos visto cómo se pueden simular métodos estáticos usando JMockit . Para una mirada más profunda a algunas de las características avanzadas de JMockit, eche un vistazo a nuestro artículo de uso avanzado de JMockit.

Como de costumbre, el código fuente completo de este tutorial está disponible en GitHub.