Obtener un contexto para su uso en AndroidTestCase cuando la clase bajo prueba no es una actividad
Estoy intentando probar usando AndroidTestCase. Estoy intentando probar solamente una clase particular en mi uso, sin embargo esta clase no extiende la actividad, el servicio o cualquier otra cosa. Es básicamente una clase Java simple aparte del hecho de que requiere un Contexto. Es un pojo y algunas de sus variables son objetos que requieren llamadas api de android en su creación, por ejemplo, una llamada al SensorManager. Traté de usar:
Context context = getContext();
Cuando ejecuto mis pruebas esto me da la excepción "Servicios del sistema no disponibles para activites antes onCreate ()". ¿Tiene que ser reemplazado? final Context context = new IsolatedContext(null, getContext())
da lo mismo.
- Prueba de unidad de Android: cómo borrar SharedPreferences
- Método getActivity () que bloquea indefinidamente mientras que la prueba de la unidad
- Prueba de unidad de Android usando ant con proyecto de biblioteca
- Reiniciar la aplicación en la prueba de Android
- Android BluetoothAdapter Mocking
La razón por la que estoy utilizando el marco de pruebas de Android y no algo como Robolectric es porque la clase que estoy probando reúne información de hardware acerca de un dispositivo y por lo tanto quiero ejecutar las pruebas en un dispositivo real. He mirado los documentos del desarrollador para AndroidTestCase pero no puedo ver lo que estoy buscando en los ejemplos. No estoy seguro de que las otras clases de casos de prueba lograrán lo que quiero. ¿Algunas ideas?
Mi clase de prueba:
public class DeviceTest extends AndroidTestCase { ClassToTest mClassToTest; @Override protected void setUp() throws Exception { final Context context = new IsolatedContext(null, getContext()) { @Override public Object getSystemService(final String pName) { return getContext().getSystemService(pName); } }; mClassToTest = new ClassToTest(context); super.setUp(); } public void testClassMethod() { Object mObject; mObject = mClassToTest.getObject(); assertNotNull(mObject); } @Override protected void tearDown() throws Exception { mClassToTest = null; super.tearDown(); } }
Gracias por adelantado.
UPDATE: Después de cambiar mi configuración a lo siguiente:
@Override protected void setUp() throws Exception { super.setUp(); context = this.getContext(); mClassToTest = new ClassToTest(context); }
Estoy recibiendo un error que el contexto es nulo. ¿En qué escenarios AndroidTestCase.getContext () devolverá null? Mi configuración parece estar bien ….
- Llamar a una actividad desde un AndroidTestCase
- Mockito: ¿Cómo uso getString con mockito?
- Android prueba testPreconditions
- El enfoque correcto para la prueba de unidades de Android
- Prueba de unidades de Android: mejores prácticas cuando el código hace referencia a clases de android
- Prueba de una clase Fragment en aislamiento usando Mockito
- Android Base64 codificar y decodificar return null en Unit Test
- Mocking biblioteca / marco que funciona mejor en Android?
Hay algunas maneras alrededor de esto, usted podría utilizar un mockcontext como una solución o si usted realmente no cuida cuál es el contexto apenas que es válido usted puede utilizar un InstrumentationTestCase y conseguir el contexto de la prueba apk vía getInstrumentation (). GetContext ().
Creo que la razón de su contexto es nulo es que en realidad no existe ningún contexto de Android en este punto, puede obtener uno mediante la creación de una aplicación o una actividad.
Desde AndroidTestCase puede acceder directamente a mContext, o llamar a getContext ().
Desde el contexto devuelto por aquellos, también se puede llamar Context.getApplicationContext () si se desea.
Puede utilizar mContext
de la superclase (AndroidTestCase). Lo usé para la prueba de la base de datos donde se requiere el contexto.
AndroidTestCase.class
public class AndroidTestCase extends TestCase { protected Context mContext; ... }
Podrías usar Context en la clase heredada de AndroidTestCase.
TestDb.java
public class TestDb extends AndroidTestCase { void deleteTheDatabase() {mContext.deleteDatabase(DB_NAME)}; }