24

Sto scrivendo alcuni test di accettazione per un'applicazione che utilizza la classe ActivityInstrumentationTestCase2. Voglio provocare un cambiamento di orientamento all'interno del test per garantire che accada un certo numero di cose. Tra queste cose ci stiamo assicurando che lo stato di attività sia preservato, ma vorrei anche assicurarmi che venga utilizzato il layout appropriato per l'orientamento.Come si forza una modifica dell'orientamento in un test di strumentazione Android?

So che posso semplicemente testare onSaveInstanceState/onRestoreInstanceState/onPause/onResume/etc. metodi per assicurarsi che lo stato dell'istanza sia preservato. Tuttavia, mi chiedevo se esiste effettivamente un meccanismo per causare un evento di cambiamento di orientamento?

Ciò comporterebbe l'iniezione di qualche tipo di evento di movimento per ingannare il dispositivo/emulatore nel pensare che sia stato ruotato o esiste un metodo effettivo fornito dalla strumentazione?

Grazie & Cheers!

risposta

46

In realtà non è necessario utilizzare Robotium per questo. Infatti, se si visualizza l'origine di tutto ciò che sta facendo Robotium quando si chiama

solo.setActivityOrientation(Solo.LANDSCAPE); 

è

myActivity = this.getActivity(); // In your setUp method() 

... 

myActivity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE); 
+0

fantastico, ha cambiato la risposta accettata alla tua. Kudo per il lavoro investigativo va a voi signore. – plainjimbo

+0

Robotium sembra più corto per questo. –

+6

E probabilmente sarà necessario richiamare 'getInstrumentation(). WaitForIdleSync();' successivamente per attendere che la modifica dell'orientamento avvenga perché viene eseguita in modo asincrono. – Ognyan

3

Utilizzare Robotium per questo. C'è una classe denominata Solo, con cui è possibile modificare l'orientamento semplicemente chiamando un metodo:

solo.setActivityOrientation(Solo.LANDSCAPE); 

Questo è tutto! Il tuo orientamento sarebbe cambiato. Puoi google Robotium e ottenere il suo barattolo e aggiungerlo al progetto Test. Il sito di Robotium fornisce anche un esempio di progetto di prova sull'app Blocco note di Android (che è disponibile come progetto di esempio con Android SDK) che mostra quanto sia potente e quanto possa essere facilmente utilizzata.

+0

Wow, grazie! È passato un po 'di tempo da quando ho fatto la domanda e ho visto molte viste. Questo risolve definitivamente il problema che ho avuto. Robotium sembra una grande libreria di test. – plainjimbo

+0

Sì, James, certo! :) –

+0

In caso contrario, Robotium non supporta i frammenti. – Martin

5

Come AndrewKS scritto è possibile utilizzare

getActivity().setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE); 
assertTrue(...); 

per richiedere un cambiamento di orientamento . Ma la rotazione stessa viene eseguita in modo asincrono. Per provare davvero lo stato dopo il cambiamento dell'orientamento è necessario attendere un breve periodo di tempo dopo la richiesta:

getActivity().setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE); 
Thread.sleep(50); // depends on performance of the testing device/emulator 
assertTrue(...);