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

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

  • Compruebe que el método se llama en onNext del suscriptor de RxJava
  • Prueba de unidad de Android con Retrofit / RxJava / Roboletric y Mockito
  • Cómo burlar un objeto inyectado que no se declara en el módulo?
  • Cómo burlar una SharedPreferences usando Mockito
  • Roboguice y simulacros: ¿Cómo roboguice inyectar un servicio de simulacro cuando la prueba, pero utiliza el REAL de lo contrario?
  • Android BluetoothAdapter Mocking
  • No puede encontrar ProxyFrameworkImpl por nombre
  • MockitoAnnotations.initMocks se bloquea mientras que mock () tiene éxito
  • ¿Cómo puedo obtener Mockito trabajando en androidTest
  • Cómo probar métodos de unidad que interactúan con clases de sistema (o Android)
  • Cómo usar Mockito / Hamcrest en las pruebas unitarias en Android Studio
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.