A la hora de realizar tests unitarios, deberíamos poder utilizar siempre la interfaz de entrada de la clase que queremos probar pero hay veces en que necesitamos probar algo que esté en su parte privada (realmente si estás haciendo ésto posiblemente es que estés haciendo algo no correcto… pero hay tantas cosas no correctas en el universo que es posible que te encuentres con algo así aunque no quieras).

Usando EasyMock no sería posible el comprobar esos métodos privados, pero podemos utilizar la librería PowerMock, la cuál nos permitirá acceder directamente a esa parte privada.

Si todo va bien, la forma de probar métodos privados es realmente sencilla. Básicamente sería algo así:

  1. Etiquetar la clase con @RunWith(PowerMockRunner.class) y  @PrepareForTest(ClassWithPrivateMethod.class)
  2. Preparar la clase que queremos probar usando lo siguiente:
    PowerMock.createPartialMock(ClassToPartiallyMock.class, "nameOfTheFirstMethodToMock", "nameOfTheSecondMethodToMock");

    Nota: Tener en cuenta que lo anterior no llamará al constructor de la clase

  3. Ponemos la llamada a la función:
    PowerMock.expectPrivate(mockObject, "nameOfTheMethodToMock", argument1, argument2);
  4. Y ejecutamos el replay y la verificación de la siguiente manera:
    PowerMock.replay(mockObject);
    PowerMock.verify(mockObject);

Éstos son los pasos básicos para ejecutar un método privado, aunque realmente hay más opciones para ello. Así mismo esta librería también ofrece la posibilidad de atacar métodos constructores privados y métodos estáticos.

Hay también otra forma de probar esos métodos privados y es utilizar reflection casi directamente gracias a los objetos Whitebox que proporciona PowerMock, quedando la llamada a un método privado como sigue:

Whitebox.invokeMethod(object, method, argument0, argument1,...);

Links

EasyMock: http://easymock.org/

PowerMock: https://code.google.com/p/powermock/

Leave a Reply

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>