with mock libreria how docs android testing mocking mockito android-testing

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})