Prueba funcional de Android con Dagger
Estoy tratando de probar una actividad con Mockito & Dagger . He podido inyectar dependencias a la Actividad en mi aplicación pero al probar la Actividad, no he podido inyectar simulacros a la Actividad. ¿Debo inyectar Activity para probar o dejar que getActivity () lo cree?
public class MainActivityTest extends ActivityInstrumentationTestCase2<MainActivity> { @Inject Engine engineMock; private MainActivity mActivity; private Button mLogoutBtn; public MainActivityTest() { super(MainActivity.class); } @Override protected void setUp() throws Exception { super.setUp(); // Inject engineMock to test ObjectGraph.create(new TestModule()).inject(this); } @Override protected void tearDown() { if (mActivity != null) mActivity.finish(); } @Module( includes = MainModule.class, entryPoints = MainActivityTest.class, overrides = true ) static class TestModule { @Provides @Singleton Engine provideEngine() { return mock(Engine.class); } } @UiThreadTest public void testLogoutButton() { when(engineMock.isLoggedIn()).thenReturn(true); mActivity = getActivity(); mLogoutBtn = (Button) mActivity.findViewById(R.id.logoutButton); // how to inject engineMock to Activity under test? ObjectGraph.create(new TestModule()).inject(this.mActivity); assertTrue(mLogoutBtn.isEnabled() == true); } }
- Obteniendo junit.framework.AssertionFailedError: No se encontraron pruebas en cuando se usa Unit y Mockito
- Apkbuilder encuentra el archivo duplicado al agregar powermock a un proyecto de prueba de android
- ¿Cómo probar correctamente ORM en android usando Mockito?
- Necesito Robolectric y Mockito en mi prueba, cada uno propone su propio TestRunner
- SecurityProvider en Mockito Pruebas cuando se ejecuta junto a Robolectric
- Cómo probar la unidad android y burlarse de un método estático
- Pruebas de instrumentación Android con Mockito
- Android: Unidad de pruebas de aplicaciones Android con Robolectric y Mockito
- Vinculación de Android y prueba JUnit de notificación
- Casos de prueba de unidad con JUnit + (Robolectric o Mockito o ambos en Android)
- ¿Cómo puedo burlarme del contexto usando Mockito y Robolectric?
- Mockito en el emulador de Android
- Intento de mockito de simular cualquier clase genera ExceptionInInitializerError
Utilizo Mockito y Dagger para pruebas funcionales. El concepto clave es que su clase de prueba hereda de ActivityUnitTestCase, en lugar de ActivityInstrumentationTestCase2; El método de ciclo de vida de la llamada super-clase onStart () de Actividad que te bloquea para inyectar tu prueba dobla dependencias, pero con la primera super-clase puedes manejar el ciclo de vida más fino.
Puedes ver mis ejemplos de trabajo usando dagger-1.0.0 y mockito para test Actividades y Fragmentos en:
https://github.com/IIIRepublica/android-civicrm-test
El proyecto en prueba está en:
https://github.com/IIIRepublica/android-civicrm
Espero que esto te ayude
Hice un poco más de experimentación y descubrí que Dagger no es capaz de crear actividad correctamente cuando se inyecta para probar. En la nueva versión de prueba, testDoSomethingCalledOnEngine pasa pero onCreate no se llama en MainActivity. La segunda prueba, testDoSomethingUI falla y en realidad hay dos instancias de MainActivity, onCreate se llama a la otra instancia (creada por ActivityInstrumentationTestCase2 I quess) pero no a la otra. Tal vez los desarrolladores de Square sólo pensó en probar Activites con Robolectric en lugar de la prueba de instrumentación de Android?
public class MainActivityTest extends ActivityInstrumentationTestCase2<MainActivity> { @Inject Engine engineMock; @Inject MainActivity mActivity; public MainActivityTest() { super(MainActivity.class); } @Override protected void setUp() throws Exception { super.setUp(); // Inject engineMock to test & Activity under test ObjectGraph.create(new TestModule()).inject(this); } @Module( includes = MainModule.class, entryPoints = MainActivityTest.class, overrides = true ) static class TestModule { @Provides @Singleton Engine provideEngine() { return mock(Engine.class); } } public void testDoSomethingCalledOnEngine() { when(engineMock.isLoggedIn()).thenReturn(true); mActivity.onSomethingHappened(); verify(engineMock).doSomething(); } @UiThreadTest public void testDoSomethingUI() { when(engineMock.isLoggedIn()).thenReturn(true); mActivity.onSomethingHappened(); Button btn = (Button) mActivity.findViewById(R.id.logoutButton); String btnText = btn.getText().toString(); assertTrue(btnText.equals("Log out")); }
}
He puesto todo junto y hecho la aplicación de demostración que muestra cómo probar con la daga: https://github.com/vovkab/dagger-unit-test
Aquí está mi respuesta permeable con más detalles:
https://stackoverflow.com/a/24393265/369348
- Importar google-play-service dependencia cruz roja
- Entidad Greendao cuando se serializa utilizando GSON no contiene entidad relacionada en Generated JSON cadena