6.1 Burlándose del método estático mockStatic()
Y un punto más importante es la burla y verificación de métodos estáticos. “¿Qué hay de malo en eso?”, preguntas. Sí, estático, pero los métodos son los mismos. Y te equivocarás.
¿Recuerdas dónde empezamos a aprender sobre objetos simulados? Dado que estos objetos se crean artificialmente a través de DynamicProxy
. Y los métodos estáticos no están vinculados a ningún objeto y DynamicProxy
es imposible interceptar llamadas a través de ellos . Eso es todo.
Pero los creadores de Mockito también pudieron esquivar aquí: escribieron su propio cargador de clases y con su ayuda pudieron reemplazar las clases sobre la marcha. Un trabajo grande y difícil, pero aun así lograron hacerlo.
Deberá agregar una biblioteca adicional a pom.xml
:
<dependency>
<groupId>org.mockito</groupId>
<artifactId>mockito-inline</artifactId>
<version>4.2.0</version>
<scope>test</scope>
</dependency>
Así es como funciona si necesita simular un método estático.
1 Cree un objeto de clase simulada especial:
MockedStatic<ClassName>managerObject = Mockito.mockStatic(ClassName.class);
2 Agregue reglas de operación a este objeto:
A este objeto de la regla es necesario aferrarse de otras maneras.
managerObject.when(ClassName::method name).thenReturn(result);
3 Asegúrese de incluir el uso de este objetotry-with-resources
para que se elimine inmediatamente y Mockito pueda borrar las reglas asociadas con él.
Ejemplo:
@Test
void givenStaticMethodWithNoArgs () {
try (MockedStatic< StaticUtils> utilities = Mockito.mockStatic( StaticUtils.class)) {
// add rule
utilities.when(StaticUtils::name).thenReturn("Hello");
// check if the rule works
assertEquals("Hello", StaticUtils.name());
}
}
No tan bonito como con anotaciones @Mock
y @Spy
, pero muy práctico. Era muy difícil escribir pruebas cuando era imposible simular un método estático simple que se usaba dentro de los métodos bajo prueba.
GO TO FULL VERSION