utilizar studio setresult getintent example como android unit-testing testing android-activity

android - studio - probando que una actividad llamada setResult



startactivityforresult fragment (3)

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

Sin embargo, mi actividad cuando finaliza devuelve datos adicionales a la actividad de llamada a través de setResult (código de resultado, Intención i) Lo que me gustaría hacer con la instrumentación es que termine mi actividad y luego verifique qué pasó en la llamada setResult.

¿Hay algún marco proporcionado forma de hacer esto? aún no he podido encontrar nada, un enfoque sería subclasificar la clase de actividad y anular setResult para que recuerde y exponer lo que se pasó a setResult (resulta que setResult es final, por lo que tampoco puedes hacer esto) , parece que debería haber una mejor manera.


Otro enfoque sería utilizar el framework de simulación moderno como jmockit, de esta forma puedes simular el comportamiento de las clases de Android sin emulador, etc. Puedes ver ejemplos en las pruebas de mi unidad: https://github.com/ko5tik/jsonserializer (versiones anteriores) funcionó contra JSON incluido con Android, y real contra GSON, pero la lógica burlona sigue ahí)


Ver mi respuesta de otra pregunta similar:

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


Como respondí en otra questiom, también puedes usar Robolectric y sombrear la actividad bajo prueba. Entonces, ShadowActivity le proporciona métodos para saber fácilmente si una actividad está finalizando 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);