android - libreria - Versión de compilación falsa con Mockito
mockito mockito (2)
Mi objetivo es simular Build.Version.SDK_INT con Mockito. Ya probado:
final Build.VERSION buildVersion = Mockito.mock(Build.VERSION.class);
doReturn(buildVersion.getClass()).when(buildVersion).getClass();
doReturn(16).when(buildVersion.SDK_INT);
El problema es que: cuando se requiere el método después de simulacro, y .SDK_INT no es un método.
Tan lejos de otras preguntas similares a esta, parece que tienes que usar la reflexión.
Valor de compilación de Build.VERSION.SDK_INT en Local Unit Test
Cómo simular una variable final estática usando JUnit, EasyMock o PowerMock
static void setFinalStatic(Field field, Object newValue) throws Exception {
field.setAccessible(true);
Field modifiersField = Field.class.getDeclaredField("modifiers");
modifiersField.setAccessible(true);
modifiersField.setInt(field, field.getModifiers() & ~Modifier.FINAL);
field.set(null, newValue);
}
... y luego, en este caso, utilízalo así ...
setFinalStatic(Build.VERSION.class.getField("SDK_INT"), 16);
Otra forma de hacerlo sería crear una clase que acceda / envuelva el campo en un método que luego se puede burlar
public interface BuildVersionAccessor {
int getSDK_INT();
}
y luego burlarse de esa clase / interfaz
BuildVersionAccessor buildVersion = mock(BuildVersionAccessor.class);
when(buildVersion.getSDK_INT()).thenReturn(16);
Esto funciona para mí mientras utilizo PowerMockito.
Whitebox.setInternalState(Build.VERSION.class, "SDK_INT", 16);
No te olvides de escribir
@PrepareForTest({Build.VERSION.class})