2010-11-12 11 views
14

Sto scrivendo dei test per un'attività (la mia classe di test estende ActivityInstrumentationTestCase2), ho scritto alcuni test di base e funzionano bene.testare un'attività che si chiama setResult

Tuttavia la mia attività al termine restituisce dati extra all'attività di chiamata tramite setResult (resultcode, Intent i) Cosa mi piacerebbe fare utilizzando la strumentazione portare a termine la mia attività, quindi controllare cosa ha passato nella chiamata setResult.

C'è qualche modo per farlo? non sono stato ancora in grado di trovare qualcosa, un approccio sarebbe quello di sottoclasse la classe di attività e sovrascrivere setResult per ricordare che & esporre ciò che è stato passato a setResult (risulta che setResult è definitivo, quindi non puoi farlo neanche) , sembra che ci dovrebbe essere un modo migliore.

risposta

1

Un altro approccio sarebbe quello di utilizzare quadro di scherno moderno come JMockit - in questo modo è possibile simulare il comportamento delle classi di Android senza emulatore ecc Si può vedere campione di esso nel mio test di unità: https://github.com/ko5tik/jsonserializer (versioni precedenti hanno lavorato contro JSON in bundle con Android, e proprio contro GSON, ma beffarda la logica è ancora lì)

5

Vedere la mia risposta da un altro domanda simile:

è possibile utilizzare la riflessione e afferrare i valori direttamente dalla Activity.

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

Come ho risposto in un altro questiom, si potrebbe anche usare Robolectric e l'ombra della attività in prova. Quindi, ShadowActivity ti fornisce i metodi per sapere facilmente se un'attività sta finendo e per recuperare il suo codice risultato.

A titolo di esempio, uno dei miei test si presenta così:

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

Per Robolectric 3+ sostituire

ShadowActivity shadowActivity = Robolectric.shadowOf(mActivity); 

con

ShadowActivity shadow = Shadows.shadowOf(activity); 
Problemi correlati