2010-11-12 9 views
14

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

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 obtener mi actividad para terminar, luego comprobar lo que pasó en la llamada setResult.

¿Hay alguna forma de marco proporcionada para hacer esto? todavía no he podido encontrar nada, un enfoque sería subclasificar la clase de actividad y anular setResult para que recuerde & 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.

Respuesta

1

Otro enfoque sería utilizar marco de burla moderno como jmockit - de esta manera se puede simular el comportamiento de las clases android sin emulador etc Usted puede ver ejemplo de ello en mis pruebas de unidad: https://github.com/ko5tik/jsonserializer (versiones anteriores trabajaron contra JSON incluido con androide, y la real contra GSON, pero burlarse de la lógica sigue ahí)

5

Véase mi respuesta a otra pregunta similar:

puede utilizar la reflexión y agarrar 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); 
    } 
} 
9

Como respondí en otro questiom, también se puede utilizar Robolectric y la sombra de la actividad que se está probando. Entonces, ShadowActivity le proporciona métodos para saber fácilmente si una actividad está finalizando y para recuperar su código de resultado.

A modo de ejemplo, una de mis pruebas se parece a esto:

@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+ de reemplazar

ShadowActivity shadowActivity = Robolectric.shadowOf(mActivity); 

con

ShadowActivity shadow = Shadows.shadowOf(activity); 
Cuestiones relacionadas