java - method - powermock maven
PowerMockito simula un único método estático y un objeto de retorno (1)
Quiero simular un método estático m1 de una clase que contiene 2 métodos estáticos, m1 y m2. Y quiero que el método m1 devuelva un objeto.
Intenté lo siguiente
1)
PowerMockito.mockStatic(Static.class, new Answer<Long>() {
@Override
public Long answer(InvocationOnMock invocation) throws Throwable {
return 1000l;
}
});
Esto llama tanto a m1 como a m2, que tiene un tipo de devolución diferente, por lo que da un error de desajuste del tipo de devolución.
2) PowerMockito.when(Static.m1(param1, param2)).thenReturn(1000l);
Pero esto no se llama cuando se ejecuta m1.
3) PowerMockito.mockPartial(Static.class, "m1");
Otorga error de compilación que mockPartial no está disponible, que obtuve de http://code.google.com/p/powermock/wiki/MockitoUsage .
Lo que quiere hacer es una combinación de parte de 1 y todos de 2.
Debe utilizar PowerMockito.mockStatic para habilitar la burla estática para todos los métodos estáticos de una clase. Esto significa que es posible unirlos usando la sintaxis when-thenReturn.
Pero la sobrecarga de 2 argumentos de mockStatic que está utilizando proporciona una estrategia predeterminada para lo que Mockito / PowerMock debería hacer cuando llama a un método que no ha anotado explícitamente en la instancia simulada.
Desde el javadoc :
Crea simulacros de clase con una estrategia específica para sus respuestas a las interacciones. Es una característica bastante avanzada y normalmente no la necesita para escribir pruebas decentes. Sin embargo, puede ser útil cuando se trabaja con sistemas heredados. Es la respuesta predeterminada, por lo que se usará solo cuando no se corte la llamada al método.
La estrategia predeterminada de stubbing es simplemente devolver null, 0 o false para el objeto, el número y los métodos con valores booleanos. Al usar la sobrecarga de 2 arg, está diciendo "No, no, no, de forma predeterminada, use esta respuesta de la subclase" para obtener un valor predeterminado. Devuelve un valor Largo, por lo que si tiene métodos estáticos que devuelven algo incompatible con Largo, hay un problema.
En su lugar, use la versión 1-arg de mockStatic para habilitar el troceo de métodos estáticos, luego use when-thenReturn para especificar qué hacer para un método en particular. Por ejemplo:
import static org.mockito.Mockito.*;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.invocation.InvocationOnMock;
import org.mockito.stubbing.Answer;
import org.powermock.api.mockito.PowerMockito;
import org.powermock.core.classloader.annotations.PrepareForTest;
import org.powermock.modules.junit4.PowerMockRunner;
class ClassWithStatics {
public static String getString() {
return "String";
}
public static int getInt() {
return 1;
}
}
@RunWith(PowerMockRunner.class)
@PrepareForTest(ClassWithStatics.class)
public class StubJustOneStatic {
@Test
public void test() {
PowerMockito.mockStatic(ClassWithStatics.class);
when(ClassWithStatics.getString()).thenReturn("Hello!");
System.out.println("String: " + ClassWithStatics.getString());
System.out.println("Int: " + ClassWithStatics.getInt());
}
}
El método estático con valor de cadena se repite para que devuelva "¡Hola!", Mientras que el método estático de valor int usa el troceo predeterminado, devolviendo 0.