Ottenere il risultato da un’attività dopo la fine(); in un Android di test di unità

Sto attualmente scrivendo alcune Android test di unità, e mentre ho ottenuto la maggior parte delle cose a lavorare come voglio io, una cosa mi ha lasciato tipo di mozzate.

Ho il seguente codice nella mia attività di test:

Intent result = new Intent();
result.putExtra("test", testinput.getText().toString());
setResult(Activity.RESULT_OK, result);
finish();

Sto cercando di capire come utilizzare la Strumentazione (o qualsiasi altra cosa) per essere in grado di leggere il risultato dell’attività, o di ottenere a l’intento dopo l’attività è terminata.
Qualcuno può aiutarmi?

  • stackoverflow.com/questions/4160755/…
  • Yup, simile domanda. Visto che prima di chiedere, ma non c’era nessuna buona risposta. Iniziato uno nuovo con un po ‘ di codice…
  • Poiché non è possibile modificare l’implementazione di setResult(int) e, pertanto, deve trust funziona, non sarebbe sufficiente verificare che il metodo è stato chiamato in corrente Activity?
InformationsquelleAutor uvesten | 2011-04-06



4 Replies
  1. 21

    È possibile utilizzare la reflection e afferrare i valori direttamente dall’Attività.

    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);
      }
    }
    • Grande! Sto usando questo invece di getActivity.getResultCode() all’interno di una unità di test, e questo funziona perfettamente
  2. 10

    O si potrebbe anche usare Robolectric e ombra l’Attività oggetto della prova. Quindi, ShadowActivity fornisce metodi per sapere facilmente se un’Attività è la finitura, e per recuperare il suo codice di risultato.

    Come un esempio, uno dei miei test simile a questo:

    @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());
    }
    • shadowActivity.isFinishing() è ormai obsoleto, Activity fornisce direttamente quella bandiera, è sufficiente utilizzare mActivity.isFinishing
  3. 1

    È possibile farlo scrivendo una attività il cui unico scopo è quello di iniziare l’attività di verifica di risultato e di salvare il risultato per affermare la correttezza nei.

    Per esempio, si potrebbe creare un’attività denominata ResultReceiverActivity. Dare tre metodi: getResultCode, getResultData, e getReceivedRequestCode, che può essere utilizzato per verificare che la testata attività restituito il giusto valore. Si creerebbe un caso di test che si estende ActivityInstrumentationTestCase2 e il generico parametro sarebbe ResultReceiverActivity. Chiamata getActivity e si ottiene l’istanza di attività.

    public class ReturnedResultTest 
        extends ActivityInstrumentationTestCase2<ResultReceiverActivity> {
    
        public void testReturnedResult() {
            ResultReceiverActivity a = getActivity();
            assertEquals(Activity.RESULT_OK, a.getResultCode());
            assertEquals("myResult", a.getResultData().getStringExtra("test"));
            assertEquals(0x9999, a.getReceivedRequestCode());
        }
    }

    ResultReceiverActivity deve ignorare onActivityResult, naturalmente, e deve solo memorizzare i valori di metodi di parametro nei suoi campi, in questo modo:

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        this.receivedRequestCode = requestCode;
        this.resultCode = resultCode;
        this.resultData = data;
    }

    Ovviamente, è possibile personalizzare la attività che ResultReceiverActivity inizia, e si può facilmente farlo utilizzando getIntent nella sua onCreate metodo. Nel caso di test, chiamata setActivityIntent prima di chiamare getActivity per impostare il cui Intento è utilizzato per l’avvio dell’attività.

    • Grazie, proverò questo! Tuttavia, ho capito che la mia domanda avrebbe dovuto essere lungo le linee di: unità di test il risultato di un’attività che richiede l’input dell’utente. (I. e., l’attività prende l’input da schermo). Abbastanza facile a prova di per sé, potrebbe essere più difficile di test di unità. Non so se tutto questo potrebbe essere chiamato un “unit test”, davvero…
  4. -1

    Non so se è diverso per i test di unità, ma si dovrebbe essere in grado di utilizzare onActivityResult come si vede qui: StartingActivities. È sufficiente avviare l’Attività con startActivityForResult(intento, requestCode) e quindi utilizzare

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data)

    torna in attività che usato startActivityForResult.

    • Sì, è vero, e grazie. Tuttavia, mi sto chiedendo in particolare circa l’unità di test case.
    • Si può aggiungere un po ‘ di dettaglio in più, alla domanda circa il problema specifico che si sta vedendo?

Lascia un commento