Join FlipAndroid.COM Telegram Group: https://t.me/joinchat/F_aqThGkhwcLzmI49vKAiw


Probando que una actividad llamada setResult

Estoy escribiendo pruebas para una actividad (mi clase de prueba se extiende ActivityInstrumentationTestCase2), tengo algunas pruebas básicas escritas y funcionando bien.

Sin embargo, mi actividad cuando se completa devuelve datos adicionales a la actividad de llamada a través de setResult (resultcode, Intent i) Lo que me gustaría hacer usando la instrumentación para terminar mi actividad y luego comprobar lo que pasó en la llamada setResult.

¿Hay algún marco proporcionado para hacer esto? No he sido capaz de encontrar nada todavía, un enfoque sería subclase de la clase de actividad y sobreescribir setResult para que se recuerde y exponer lo que se pasó a setResult (resulta setResult es final, por lo que no puede hacer esto tampoco) , Parece que debería haber una mejor manera.

3 Solutions collect form web for “Probando que una actividad llamada setResult”

Como respondí en otra pregunta, también podría usar Robolectric y sombrear la actividad bajo prueba. A continuación, ShadowActivity le proporciona métodos para saber fácilmente si una Actividad está terminando y para recuperar su código de resultado.

Como ejemplo, una de mis pruebas se ve así:

@Test public void testPressingFinishButtonFinishesActivity() { mActivity.onCreate(null); ShadowActivity shadowActivity = Robolectric.shadowOf(mActivity); Button finishButton = (Button) mActivity.findViewById(R.id.finish_button); finishButton.performClick(); assertEquals(DummyActivity.RESULT_CUSTOM, shadowActivity.getResultCode()); assertTrue(shadowActivity.isFinishing()); } 

Para Robolectric 3+ reemplazar

 ShadowActivity shadowActivity = Robolectric.shadowOf(mActivity); 

con

 ShadowActivity shadow = Shadows.shadowOf(activity); 

Vea mi respuesta de otra pregunta similar:

Puede utilizar la reflexión y tomar los valores directamente de la actividad.

 protected Intent assertFinishCalledWithResult(int resultCode) { assertThat(isFinishCalled(), is(true)); try { Field f = Activity.class.getDeclaredField("mResultCode"); f.setAccessible(true); int actualResultCode = (Integer)f.get(getActivity()); assertThat(actualResultCode, is(resultCode)); f = Activity.class.getDeclaredField("mResultData"); f.setAccessible(true); return (Intent)f.get(getActivity()); } catch (NoSuchFieldException e) { throw new RuntimeException("Looks like the Android Activity class has changed it's private fields for mResultCode or mResultData. Time to update the reflection code.", e); } catch (Exception e) { throw new RuntimeException(e); } } 

Otro enfoque sería utilizar el marco de burla moderna como jmockit – de esta manera se puede simular el comportamiento de las clases de Android sin emulador, etc Usted puede ver una muestra de ello en mis pruebas de unidad: https://github.com/ko5tik/jsonserializer (versiones anteriores Trabajado contra JSON incluido con Android, y actual contra GSON, pero la lógica burlona sigue ahí)

FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.