studio sola samsung rotar rotación rotacion reinicie que pantalla movil manejando grados girar gira evitar como celular activity android robotium android-espresso ui-testing espresso

sola - rotacion de pantalla android studio



¿Cómo rotar la actividad, quiero decir: cambio de orientación de la pantalla usando Espresso? (5)

Cómo girar la pantalla:

public static void rotateScreen(Activity activity) { final CountDownLatch countDownLatch = new CountDownLatch(1); final int orientation = InstrumentationRegistry.getTargetContext() .getResources() .getConfiguration() .orientation; final int newOrientation = (orientation == Configuration.ORIENTATION_PORTRAIT) ? ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE : ActivityInfo.SCREEN_ORIENTATION_PORTRAIT; activity.setRequestedOrientation(newOrientation); getInstrumentation().waitForIdle(new Runnable() { @Override public void run() { countDownLatch.countDown(); } }); try { countDownLatch.await(); } catch (InterruptedException e) { throw new RuntimeException("Screen rotation failed", e); } }

La Activity se puede obtener de la ActivityRule .

Decidí que uno de los criterios de prueba para las pruebas de mi aplicación con Espresso de Google es:

La prueba debe mantener el estado de actividad después de la rotación de orientación de la pantalla

¿Cómo roto la pantalla cuando uso Espresso?


He probado el siguiente código de Robotium (Sí, puse el código de Robotium en mi prueba de espresso, así que solicíteme)

solo.setActivityOrientation(solo.LANDSCAPE); solo.setActivityOrientation(solo.PORTRAIT);

pero bloquea la aplicación cuando la ejecuto dentro de mi prueba de Espresso.
¿Hay alguna manera de hacer esto?

Gracias de antemano por cualquier ayuda


Esta solución más completa crea un Espresso ViewAction personalizado y funciona bien. Muestra cómo obtener la Activity (incluso cuando es una AppCompatActivity ) antes de llamar a su método setRequestedOrientation() . También tiene una interfaz de llamada limpia:

onView(isRoot()).perform(orientationLandscape()); onView(isRoot()).perform(orientationPortrait());

Sigo cada cambio de orientación con un retraso de 100 ms, aunque es posible que no lo necesites.


No se pueden mezclar las pruebas de Robotium y Espresso. La mejor manera de resolver cualquier problema a veces es verificar el código fuente del método deseado pero no compatible.

Estoy bastante seguro de que ya setUp() método setUp() , que tiene un código como:

myActivity = this.getActivity();

Use esto para cambiar el cambio de orientación de su pantalla:

myActivity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);

o

myActivity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);

Es posible que también necesite usar myActivity.getInstrumentation().waitForIdleSync(); o Thread.sleep(milliseconds); para esperar el final de la rotación porque se realiza de forma asíncrona. El segundo método depende del emulador / dispositivo, así que elíjalo sabiamente.

Espero que te ayude.


Puedes hacerlo con la librería uiautomator.

dependencies { androidTestImplementation ''com.android.support.test.uiautomator:uiautomator-v18:2.1.3'' }

ui automator requiere min sdk versión 18, por lo que si su aplicación tiene un min sdk más bajo, debe crear un nuevo AndroidManifest.xml en la carpeta de androidTest de androidTest

<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:tools="http://schemas.android.com/tools" package="your.package.name"> <uses-sdk tools:overrideLibrary="android.support.test.uiautomator.v18"/> </manifest>

y luego en tu prueba

UiDevice device = UiDevice.getInstance(getInstrumentation()); device.setOrientationLeft(); device.setOrientationNatural(); device.setOrientationRight();


Si tiene la única actividad en su caso de prueba, puede hacer:

1. Declara la Rule prueba.

@Rule public ActivityTestRule<TestActivity> mActivityTestRule = new ActivityTestRule<>(TestActivity.class);

2. Hazte Activity y aplica una rotación de pantalla.

mActivityTestRule.getActivity().setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE); mActivityTestRule.getActivity().setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);

Eso es un pedazo de pastel!