2016-06-28 18 views
6

Mi chiedo se è comunque necessario arrestare il valore di Build.Version.SDK_INT? Supponiamo che io abbia le seguenti righe nel ClassUnderTest:Valore di stub di Build.VERSION.SDK_INT in Test unità locale

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) { 
    //do work 
}else{ 
    //do another work 
} 

Come posso coprire tutto il codice?

Voglio dire che voglio eseguire due test con diversi SDK_INT per inserire entrambi i blocchi.

E 'possibile in Android test di unità locali utilizzando Mockito/PowerMockito?

Grazie

risposta

19

Modificare il valore utilizzando la riflessione.

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

E poi

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

E 'testato. Lavori.

+0

Questo non funzionerà perché getField() si aspetta il nome della variabile e Build.VERSION.SDK_INT è in realtà un valore. –

+3

setFinalStatic (Build.VERSION.class.getField ("SDK_INT"), "123"); Se ciò non funziona, forse PowerMockito può essere mockito e simulare il campo statico. – toshkinl

+0

Grazie! Lavorato! –