mock compatible and java mocking mockito powermock

java - compatible - powermockito



PowerMock+Mockito VS Mockito solo (4)

No sé de otros beneficios de forma directa, pero quiero abordar 2 de sus subpreguntas (y esto es demasiado largo para un comentario):

permitir la burla sin inyección de dependencia: esta no es clara para mí. ¿Puedes elaborar?

Creo que esto vino de la página de la wiki de Motivación, donde describen una forma de refactorizar el código para no invocar métodos estáticos para que sea comprobable. Para un ejemplo concreto de lo que creo que están obteniendo, digamos que tienes este código y quieres probar el método burlándose del comportamiento del método estático, sin usar powermock:

public class MyClass { public void doGetString() { ... OtherClass.getString(); //It''s complex and scary and needs mocking! ... } }

Una solución sería extraer la invocación estática en su propio objeto, luego inyectar un objeto que se pueda burlar durante el tiempo de prueba. Por ejemplo, sin usar otros marcos, esto podría verse así:

public class MyClass { public static class StringGetter { public getString() { return OtherClass.getString(); } } private final StringGetter getter; //Existing Constructor public MyClass() { this(new StringGetter()); } //DI Constructor MyClass(StringGetter getter) { this.getter = getter; } public void doGetString() { ... getter.getString(); ... } }

Separé el comportamiento de mi método del comportamiento de la invocación estática y puedo usar el constructor DI para inyectar simulacros fácilmente en el momento de la prueba. Por supuesto, con powermock podría simplemente burlarme del método estático en su lugar, y correr con él.

¿Y debo sacrificar algo cuando uso PowerMock?

Físicamente no, pero yo diría filosóficamente sí :). Las siguientes son mis opiniones, y trato de dar buenas razones detrás de ellas, pero por supuesto son opiniones, así que tómalas con un grano de sal:

Lo potencialmente aterrador que está sucediendo con PowerMock es que para lograr las hazañas de burlar los métodos privados y estáticos, están usando un cargador de clases personalizado (que no debería estar presente en tiempo de ejecución en producción) y cambiando el bytecode de sus clases . Podría decirse que esto no debería importar en la gran mayoría de las clases la mayor parte del tiempo, pero si lo piensas, si el bytecode ha cambiado y ciertos efectos secundarios ya no están presentes, estás probando diferentes clases de acuerdo a tu Clases existentes. Sí, este es un argumento muy académico.

Puede mitigar de alguna manera este primer argumento teniendo una buena integración integral y pruebas de nivel superior que no utilicen PowerMock. De esta forma, puede tener más confianza en el comportamiento de sus objetos, incluso si las pruebas de su unidad utilizan PowerMock.

El otro argumento que tengo en contra de PowerMock es que casi con demasiada facilidad podría convertirse en una muleta. Estoy de acuerdo en que PowerMock puede ayudar con el código de prueba que usa código heredado y otro código sobre el que no tiene control. Sin embargo, yo diría que cuando tienes control sobre las clases que necesitas para burlarte, debes evitar su uso. Si escribe una clase con un método privado o estático del que necesita burlarse explícitamente para probar otros métodos, mi instinto me diría que este método puede estar haciendo demasiado y debería ser refactorizado y descompuesto. Teniendo PowerMock ya disponible en un proyecto, puede tener la tentación de simplemente burlarse de él y seguir adelante, lo que mitigaría el dolor que debería alentarlo a refactorizar el mismo. Sí, a veces se deben a varias limitaciones técnicas y no técnicas, pero esto no es posible, pero es bueno resolver los puntos débiles en lugar de evitarlos :)

¿Puede alguien por favor resumir, qué características le da exactamente la adición de PowerMock encima del Mockito?

Hasta ahora he encontrado esto:

  • simulacro de métodos estáticos, finales y privados
  • eliminar inicializadores estáticos
  • permitir la burla sin inyección de dependencia: esta no es clara para mí. ¿Puedes elaborar?

¿Agrega algo más? ¿Puedes resumir en varias líneas?

¿Y debo sacrificar algo cuando uso PowerMock?


Otra característica de la extensión de mockito Powermock es que admite la burla y el punteo de iguales y hashcode .

Al igual que con todas las características de powermock para ser utilizado con cuidado, pero la adición de igualdad (basada en el valor) para resultados específicos puede ser útil.


Una característica más de PowerMock es que podemos simular la construcción de nuevos objetos en un método. Es útil cuando no podemos cambiar el código del método que se probará.


PowerMock es una extensión de Mockito que permite la burla de métodos estáticos, constructores, clases y métodos finales, métodos privados, eliminación de inicializadores estáticos y más.