Cómo probar la interacción simulada en Activity onResume () ¿Utilizando Dagger Modules y Robolectric?

Estoy usando Dagger para mi inyección de dependencia, funciona bien en mi aplicación pero tengo problemas para probarlo. He seguido este patrón para crear el gráfico de dependencia de módulos: https://github.com/pyricau/shipfaster/blob/master/src/main/java/com/squareup/shipfaster/common/ShipFasterApplication.java

Ahora, en mi clase de prueba de MainActivity, quiero poder verificar la interacción con un simulacro cuando se llama al método Activity onResume ().

Aquí está la clase:

@Config(emulateSdk = 18) @RunWith(RobolectricDaggerTestRunner.class) public class MainActivityTest extends TestCase { @Inject MainActivity sut; public @Mock MyObject mockMyObject; @Before public void setUp() throws Exception { MockitoAnnotations.initMocks(this); ObjectGraph.create(new TestModule()).inject(this); } @Test public void testThatMyActivityDelegatesDoSomethingToMyObject(){ //init ActivityController<MainActivity> activityController = ActivityController.of(sut); //run activityController.create().start().resume(); //verify Mockito.verify(mockMyObject).doSomething(); } @Module( includes = {ActivityModule.class}, injects = MainActivityTest.class, overrides = true, library = true ) class TestModule { @Provides MyObject provideMyObject() { return mockMyObject; } } } 

Por lo que puedo ver, el método onCreate() se llama, pero se utiliza una instancia real de myObject , no la mocked. La prueba falló con un "quería pero no se invocó – En realidad, hubo cero interacciones con este simulacro." error.

Quizás esto es porque la MainActivity que estoy intentando crear usando Robolectric no está asociada con mi TestModule porque se creó en el nivel de la Aplicación, pero consigo hacer que esa prueba pase por llamar explícitamente a un método en MainActivity y poner myObject. DoSomething (), pero lo que necesito es probar las llamadas de ciclo de vida de Android.

¿Alguna idea de cómo puedo probar esto?

2 Solutions collect form web for “Cómo probar la interacción simulada en Activity onResume () ¿Utilizando Dagger Modules y Robolectric?”

El objeto real se utiliza porque supongo que tiene inicialización de ObjectGraph en su clase de Application . Cuando llame a ((Application) getApplication()).inject(this) durante las pruebas que está utilizando la misma ObjectGraph como cuando acaba de ejecutar su aplicación.

En esta prueba está creando completamente ObjectGraph nuevo con la instancia simulada de MyObject . Este simulacro se inyecta sólo en MainActivityTest porque cuando se MainActivity en MainActivity inject() se usa ObjectGraph en Application .

Lo que puedes hacer es hacer la clase TestApplication (tiene que tener el mismo paquete que tu clase Application pero necesita estar en el directorio de prueba) whitch amplía tu aplicación y agrega tu TestModule para reemplazar instancias reales con mocks. Por ejemplo de esta manera:

MyApplication.java

 package com.example.myapp; public class MyApplication extends Application { ObjectGraph graph; private Account currentAccount; @Override public void onCreate() { super.onCreate(); graph = ObjectGraph.create(getModules().toArray()); init(); } void init() { // initialization stuff should not be called in tests } List<Object> getModules() { List<Object> modules = new ArrayList<>(); modules.add(new ActivityModule(this)); return modules; } public void inject(Object object) { graph.inject(object); } } 

TestMyApplication.java

 package com.example.myapp; public class TestMyApplication extends MyApplication { @Override void init() { } @Override List<Object> getModules() { modules = super.getModules(); modules.add(new TestModule()); return modules; } } 

Tuve los mismos problemas hace algún tiempo, pero me las arreglé para solucionarlo así: Prueba de Android con Robolectric y Dagger

La sugerencia de WojciechKo puede funcionar en algunos casos, pero mi solución puede funcionar sin reemplazar la clase Application en sus tests. La diferencia es que todavía necesita proporcionar una forma de inyectar módulos Dagger en su aplicación en lugar de instanciarlos en la clase Application. De esta manera, en su clase de prueba puede agregar el TestModule para reemplazar el que se utiliza en la clase de aplicación real.

Si tienes problemas con la solución presentada en ese enlace, hazme saber y podemos investigar el problema.

  • Prueba de unidad de Android Studio: leer datos (entrada)
  • Los simulacros de Mockito ejecutan el código actual de Android en Lollipop o superior
  • Pruebas Robolectric que se ejecutan en Android Studio pero no en la línea de comandos
  • Java.lang.UnsatisfiedLinkError: dbopen
  • El uso de InstrumentationTestRunner personalizado en Eclipse provoca un error
  • Prueba de la unidad de Android con AsyncTask y la solución de actualizaciones de interfaz de usuario
  • Enredado con la prueba de Google
  • PowerMock en el proyecto Android
  • Cómo ensayar un servicio de Android que depende de una conexión de red
  • Prueba de unidad Android SMS Receiver
  • Creación de un simulador de AlarmManager para la prueba
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.