static mocking mockito void powermock

static - ¿Cómo me burlo de un método estático que devuelve vacío con PowerMock?



mocking mockito (4)

Tengo algunos métodos de utilidad estáticos en mi proyecto, algunos solo pasan o lanzan una excepción. Hay muchos ejemplos sobre cómo simular un método estático que tiene un tipo de devolución que no es nulo. Pero, ¿cómo puedo simular un método estático que devuelve vacío a solo " doNothing() "?

La versión no nula utiliza estas líneas de códigos:

@PrepareForTest(StaticResource.class)

...

PowerMockito.mockStatic(StaticResource.class);

...

Mockito.when(StaticResource.getResource("string")).thenReturn("string");

Sin embargo, si se aplica a un StaticResources que devuelve void , la compilación se quejará de que when(T) no es aplicable para el vacío ...

¿Algunas ideas?

Una solución alternativa sería simplemente hacer que todos los métodos estáticos devuelvan algo de Boolean para tener éxito, pero no me gustan las soluciones.


En términos más simples, imagina si quieres simulacro debajo de la línea:

StaticClass.method();

luego escribes a continuación líneas de código para simular:

PowerMockito.mockStatic(StaticClass.class); PowerMockito.doNothing().when(StaticClass.class); StaticClass.method();


Para burlarse de un método estático que devuelve vacío para, por ejemplo, Fileutils.forceMKdir(File file),

Código de muestra:

File file =PowerMockito.mock(File.class); PowerMockito.doNothing().when(FileUtils.class,"forceMkdir",file);


Puede resguardar un método de vacío estático como este:

PowerMockito.doNothing().when(StaticResource.class, "getResource", anyString());

Aunque no estoy seguro de por qué te molestaría, porque cuando llamas a mockStatic (StaticResource.class), todos los métodos estáticos en StaticResource son por defecto trocados

Más útil, puede capturar el valor pasado a StaticResource.getResource () de esta manera:

ArgumentCaptor<String> captor = ArgumentCaptor.forClass(String.class); PowerMockito.doNothing().when( StaticResource.class, "getResource", captor.capture());

A continuación, puede evaluar la cadena que se pasó a StaticResource.getResource de esta manera:

String resourceName = captor.getValue();


Puedes hacerlo de la misma manera que lo haces con Mockito en instancias reales. Por ejemplo, puede encadenar talones, la siguiente línea hará que la primera llamada no haga nada, luego la segunda y futura llamada a getResources lanzará la excepción:

// the stub of the static method doNothing().doThrow(Exception.class).when(StaticResource.class); StaticResource.getResource("string"); // the use of the mocked static code StaticResource.getResource("string"); // do nothing StaticResource.getResource("string"); // throw Exception

Gracias a una observación de Matt Lachman, tenga en cuenta que si la respuesta predeterminada no se cambia en el momento de la creación simulada, el simulacro no hará nada por defecto. Por lo tanto, escribir el siguiente código es equivalente a no escribirlo.

doNothing().doThrow(Exception.class).when(StaticResource.class); StaticResource.getResource("string");

Sin embargo, dicho esto, puede ser interesante para los colegas que leerán la prueba que no esperan nada de este código en particular. Por supuesto, esto se puede adaptar dependiendo de cómo se perciba la comprensibilidad de la prueba.

Por cierto, en mi humilde opinión, debes evitar burlar el código estático si estás creando código nuevo. En Mockito creemos que, por lo general, es una pista para un mal diseño, puede llevar a un código que no se puede mantener. Aunque el código heredado existente es otra historia.

En términos generales, si necesita burlarse de un método privado o estático, este método hace demasiado y debe ser externalizado en un objeto que será inyectado en el objeto evaluado.

Espero que ayude.

Saludos