android - rusa - guerra en siria hoy
¿Espresso cómo probar si la actividad está terminada? (4)
Quiero afirmar que mi actividad que actualmente estoy probando está terminada cuando se realizan ciertas acciones. Lamentablemente, hasta ahora solo he de afirmarlo agregando un poco de sueño al final de la prueba. ¿Hay alguna manera mejor?
import android.content.Context;
import android.os.Build;
import android.support.test.rule.ActivityTestRule;
import android.test.suitebuilder.annotation.LargeTest;
import org.junit.Before;
import org.junit.Rule;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.JUnit4;
import static org.junit.Assert.assertTrue;
@SuppressWarnings("unchecked")
@RunWith(JUnit4.class)
@LargeTest
public class MyActivityTest {
Context context;
@Rule
public ActivityTestRule<MyActivity> activityRule
= new ActivityTestRule(MyActivity.class, true, false);
@Before
public void setup() {
super.setup();
// ...
}
@Test
public void finishAfterSomethingIsPerformed() throws Exception {
activityRule.launchActivity(MyActivity.createIntent(context));
doSomeTesting();
activityRule.getActivity().runOnUiThread(new Runnable() {
@Override
public void run() {
fireEventThatResultsInTheActivityToFinishItself();
}
});
Thread.sleep(2000); // this is needed :(
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) {
assertTrue(activityRule.getActivity().isDestroyed());
}
}
}
En mi caso puedo probar para isFinishing()
:
assertTrue(activityTestRule.getActivity().isFinishing());
en lugar de:
Thread.sleep(2000); // this is needed :(
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) {
assertTrue(activityRule.getActivity().isDestroyed());
}
Otra ventaja de isFinishing()
es que no necesita la comprobación de versión.
No estoy seguro si es una buena práctica pero esto funcionó para mí:
assertTrue(mTestRule.getActivity() == null);
Puede utilizar el ejemplo de StartActivityForResult a continuación, más descripciones en los enlaces.
Cómo iniciar la actividad desde FirstActivity:
Intent i = new Intent(this, SecondActivity.class);
startActivityForResult(i, 1);
Así es como terminas tu SecondActivity para volver al primero (sin enviar el resultado):
Intent returnIntent = new Intent();
setResult(Activity.RESULT_CANCELED, returnIntent);
finish();
Cómo generar un evento cuando se termina SecondActivity (se escribe en FirstActivity):
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
if (requestCode == 1) {
}
}//onActivityResult
Puede encontrar más información aquí: http://developer.android.com/training/basics/intents/result.html y allí ¿Cómo administrar `startActivityForResult` en Android? También existe la forma de enviar los datos que desea obtener de SecondActivity.
Tal vez un poco tarde pero esto también es posible:
assertThat(activityRule.getActivityResult(), hasResultCode(Activity.RESULT_CANCELED));