when uso usar unitarios tutorial test examples datos como java methods static mockito

java - uso - ¿Por qué Mockito no simula métodos estáticos?



tutorial mockito java (5)

Leí algunos hilos sobre métodos estáticos y creo que entiendo los problemas que puede causar el uso indebido / uso excesivo de métodos estáticos. Pero realmente no llegué al fondo de por qué es difícil burlarse de los métodos estáticos.

Sé que otros marcos de burla, como PowerMock, pueden hacer eso, pero ¿por qué no puede Mockito?

Leí este artículo , pero el autor parece estar religiosamente en contra de la palabra static , tal vez sea mi pobre comprensión.

Una explicación / enlace fácil sería genial.


Creo que la razón puede ser que las bibliotecas de objetos simulados suelen crear simulacros mediante la creación dinámica de clases en tiempo de ejecución (utilizando cglib ). Esto significa que implementan una interfaz en tiempo de ejecución (eso es lo que hace EasyMock si no me equivoco), o que heredan de la clase para burlarse (eso es lo que hace Mockito si no me equivoco). Ambos enfoques no funcionan para los miembros estáticos, ya que no se pueden anular mediante el uso de la herencia.

La única forma de simular las estadísticas es modificar el código de bytes de una clase en el tiempo de ejecución, que supongo que es un poco más complicado que la herencia.

Eso es lo que creo, por lo que vale la pena ...


En algunos casos, los métodos estáticos pueden ser difíciles de probar, especialmente si necesitan burlarse, por lo que la mayoría de los marcos de burla no los admiten. Encontré que this publicación de blog es muy útil para determinar cómo simular métodos y clases estáticos.


En serio, creo que es el olor del código si también necesitas simular métodos estáticos.

  • ¿Métodos estáticos para acceder a la funcionalidad común? -> Use una instancia de singleton e inyecte eso
  • Código de terceros? -> Envuélvalo en su propia interfaz / delegado (y si es necesario, conviértalo en un singleton, también)

La única vez que esto me parece excesivo, es libs como Guava, pero no deberías tener que burlarte de este tipo porque es parte de la lógica ... (cosas como Iterables.transform (..))
De esa manera, su propio código se mantiene limpio, puede burlarse de todas sus dependencias de una manera limpia y tiene una capa anticorrupción contra las dependencias externas. He visto PowerMock en la práctica y todas las clases para las que lo necesitábamos estaban mal diseñadas. También la integración de PowerMock a veces causó serios problemas.
(por ejemplo, https://code.google.com/p/powermock/issues/detail?id=355 )

PD: Lo mismo vale para los métodos privados, también. No creo que las pruebas deban conocer los detalles de los métodos privados. Si una clase es tan compleja que tienta burlarse de los métodos privados, probablemente sea una señal para dividir esa clase ...


Mockito devuelve objetos, pero estática significa "nivel de clase, no nivel de objeto". Por lo tanto, mockito dará una excepción de puntero nulo para estática.


Si necesita burlarse de un método estático, es un indicador fuerte para un mal diseño. Por lo general, te burlas de la dependencia de tu clase bajo prueba. Si su clase bajo prueba se refiere a un método estático, como java.util.Math # sin, por ejemplo, significa que la clase bajo prueba necesita exactamente esta implementación (de precisión contra velocidad, por ejemplo). Si desea abstraerse de una implementación sinusal concreta, probablemente necesite una interfaz (¿ve a dónde va esto)?