Testant qu'une activité appelée setResult

J'écris des tests pour une activité (ma classe de test étend l'activitéInstrumentationTestCase2), j'ai écrit quelques tests de base et fonctionnent bien.

Cependant, mon activité quand elle est terminée renvoie des données supplémentaires à l'activité d'appel via setResult (resultcode, Intent i) Ce que j'aimerais faire à l'aide de l'instrumentation, termine ma activité, puis vérifie ce qu'elle a passé dans l'appel setResult.

Y a-t-il un cadre pour faire cela? Je n'ai encore pu trouver rien, une approche serait de sous-classer la classe d'activité et de remplacer setResult pour l'avoir rappelé et exposer ce qui a été passé à setResult (tourne setResult est définitif, donc vous ne pouvez pas le faire non plus) , Il semble qu'il devrait y avoir une meilleure façon.

3 Solutions collect form web for “Testant qu'une activité appelée setResult”

Comme je l'ai répondu dans une autre quête, vous pouvez également utiliser Robolectric et ombrez l'activité sous test. Ensuite, ShadowActivity vous fournit des méthodes pour savoir si une activité est terminée et pour récupérer son code de résultat.

À titre d'exemple, l'un de mes tests ressemble à ceci:

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

Pour Robolectric 3+ replace

 ShadowActivity shadowActivity = Robolectric.shadowOf(mActivity); 

avec

 ShadowActivity shadow = Shadows.shadowOf(activity); 

Voir ma réponse d'une autre question similaire:

Vous pouvez utiliser la réflexion et saisir les valeurs directement à partir de l'activité.

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

Une autre approche serait d'utiliser un cadre modeste moderne comme jmockit – de cette façon, vous pouvez simuler le comportement des classes Android sans émulateur, etc. Vous pouvez en voir un exemple dans mes tests unitaires: https://github.com/ko5tik/jsonserializer (versions précédentes A travaillé contre JSON regroupé avec Android, et réelle contre GSON, mais la logique de moqueur est toujours là)

coAndroid est un fan Android de Google, tout sur les téléphones Android, Android Wear, Android Dev et Android Games Apps.