PowerMock + Mockito VS Mockito solo


¿Puede alguien resumir, qué características exactamente le da la adición de PowerMock en la parte superior del Mockito?

Hasta ahora he encontrado estos:

  • métodos simulados estáticos, finales y privados
  • eliminar inicializadores estáticos
  • permitir la burla sin inyección de dependencia - esto no está claro para mí. ¿Puedes explicarlo?

¿Añade algo más? ¿Puede resumir en varias líneas?

Y necesito sacrificar algo al usar ¿PowerMock?

Author: skaffman, 2011-05-18

4 answers

No conozco otros beneficios de repente, pero quiero abordar 2 de sus sub-preguntas (y esto es demasiado largo para un comentario):

Permitir burlarse sin inyección de dependencia - esto no está claro para mí. ¿Puedes explicarlo?

Creo que esto vino de la página wiki de motivación donde describen una forma de refactorizar código para no invocar métodos estáticos para hacerlo comprobable. Para un ejemplo concreto de lo que creo que quieren decir, digamos que tienes este código y desea 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 tirar de la invocación estática en su propio objeto, a continuación, inyectar un objeto que puede ser burlado llegado el tiempo de prueba. Por ejemplo, sin usar otros frameworks, esto podría verse como:

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

He separado el comportamiento de mi método del comportamiento de la invocación estática, y puedo usar el constructor DI para inyectar simulaciones fácilmente en la prueba tiempo. Por supuesto, con Powermock podría simplemente burlarme del método estático en su lugar, y ejecutar con él.

¿Y necesito 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 que son opiniones, así que tómalas con un grano de sal:

La cosa potencialmente aterradora que está sucediendo con PowerMock es que con el fin de lograr las hazañas de burlándose de 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 con 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 efectivamente diferentes Clases albiet basadas en tus clases existentes. Si este es un argumento muy académico.

Usted puede mitigar un poco este primer argumento al tener una buena integración integral y pruebas de nivel superior que no usan PowerMock. De esta manera puede tener más confianza en el comportamiento de sus objetos incluso si sus pruebas unitarias están utilizando PowerMock.

El otro argumento que tengo contra PowerMock, es que podría casi demasiado fácilmente convertirse en una muleta. Estoy de acuerdo en que PowerMock puede ayudar con el código de prueba que utiliza código heredado y otro código sobre el que usted no tiene control. Sin embargo lo haría argumenta que cuando tienes control sobre las clases que necesitas burlarte, debes evitar su uso. Si usted escribe una clase con un método privado o método estático que necesitan explícitamente simulacros para probar otros métodos, mi instinto diría que este método se puede hacer demasiado y debe ser refactorizado y roto. Al tener PowerMock ya disponible en un proyecto, puede verse tentado a simplemente burlarse de él y seguir adelante, lo que mitigaría el dolor que debería alentarlo a refactorizar el igual. Sí, a veces, debido a varias limitaciones técnicas y no técnicas, esto no es posible, pero es bueno resolver los puntos débiles en lugar de evitarlos:)

 42
Author: Charlie,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-06-17 12:57:26

Otra característica de la extensión Powermock mockito es que admite burlas y stubbing de iguales y hashcode.

Al igual que con todas las características de powermock, se debe usar con cuidado, pero agregar igualdad (basada en el valor) para resultados específicos puede ser útil.

 6
Author: avandeursen,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-03-07 08:07:04

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 a ser probado.

 4
Author: Caesar,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-02-29 22:36:48

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

 4
Author: Premraj,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-08-09 00:15:34