2016-10-28 5 views
2

Моя цель - высмеять Build.Version.SDK_INT с Mockito. Уже пробовал:Mock Build Version with Mockito

final Build.VERSION buildVersion = Mockito.mock(Build.VERSION.class); 
doReturn(buildVersion.getClass()).when(buildVersion).getClass(); 
doReturn(16).when(buildVersion.SDK_INT); 

Проблема заключается в том, что: когда требуется метод после того, как насмешка, и .SDK_INT это не метод.

+0

http://stackoverflow.com/questions/38074224/stub-value-of-build-version-sdk-int-in-local-unit -test – Nkosi

+0

Возможно, нет ..? Похоже, вы пытаетесь насмехаться слишком сильно. Если вы пытаетесь получить покрытие кода для строки кода, которая считывает этот int, то почему? Если вы пытаетесь заставить систему показать, что она ведет себя по-разному с разными сборками, то заверните вызов 'Build' за то, что вы МОЖЕТ насмехаться. –

ответ

4

До сих пор, помимо других вопросов, подобных этому, похоже, что вы должны использовать отражение.

Stub value of Build.VERSION.SDK_INT in Local Unit Test

How to mock a static final variable using JUnit, EasyMock or 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); 
} 

... и то в этом случае использовать его как это ...

setFinalStatic(Build.VERSION.class.getField("SDK_INT"), 16); 

Другой путь вокруг было бы создать класс, который получает доступ к/обертывает поле в методе, который может быть позже высмеян

public interface BuildVersionAccessor { 
    int getSDK_INT(); 
} 

, а затем насмешливо, что класс/интерфейс

BuildVersionAccessor buildVersion = mock(BuildVersionAccessor.class); 
when(buildVersion.getSDK_INT()).thenReturn(16); 
+0

Превосходно - это намного более чистое решение – Ash

2

Это работает для меня в то время как с помощью PowerMockito.

Whitebox.setInternalState(Build.VERSION.class, "SDK_INT", 16); 

Не забудьте ввести

@PrepareForTest({Build.VERSION.class})