2013-05-26 17 views
16

Ho un codice che voglio testare. Voglio verificare se una stringa è composta correttamente da varie stringhe che ho nelle risorse. La sfida qui è trattare più traduzioni nelle mie risorse. So che le impostazioni internazionali possono essere un problema durante il test di un'applicazione desktop e che si consiglia di creare test indipendenti dalla locale.Locale durante il test dell'unità su Android

Ho trovato che è possibile impostare le impostazioni internazionali in modo programmatico, ma non è stato consigliato (vedere Change language programmatically in Android). Mentre questa domanda ha lo scopo di cambiare le impostazioni locali in fase di esecuzione quando si esegue un'applicazione normalmente, mi chiedevo se c'era una soluzione migliore al mio problema.

+0

Mi interessa anche questo, quindi la taglia. Le mie specifiche: sto provando da Eclipse e mi piacerebbe poter cambiare le impostazioni internazionali, incluso il fuso orario, nel modo più fluido possibile, all'interno di una suite. Mi piacerebbe vedere un esempio funzionante di come farlo in una risposta. –

+0

@MattGibson Ho aggiornato la mia risposta con un esempio funzionante. Cambia le impostazioni locali sia per i formattatori di date che per le risorse dell'applicazione. –

risposta

37

Se è solo per il test, è possibile modificare le impostazioni internazionali in modo programmatico senza problemi. Cambierà la configurazione della tua app e sarai in grado di testare il tuo codice con le nuove impostazioni internazionali. Ha lo stesso effetto come se un utente lo avesse cambiato. Se si desidera automatizzare i test, è possibile scrivere uno script che modifichi le impostazioni internazionali utilizzando adb shell come described here e successivamente avviare i test.

Ecco un esempio di testare traduzioni di parola "Annulla" per l'inglese, il tedesco e locali spagnoli:

public class ResourcesTestCase extends AndroidTestCase { 

    private void setLocale(String language, String country) { 
     Locale locale = new Locale(language, country); 
     // here we update locale for date formatters 
     Locale.setDefault(locale); 
     // here we update locale for app resources 
     Resources res = getContext().getResources(); 
     Configuration config = res.getConfiguration(); 
     config.locale = locale; 
     res.updateConfiguration(config, res.getDisplayMetrics()); 
    } 

    public void testEnglishLocale() { 
     setLocale("en", "EN"); 
     String cancelString = getContext().getString(R.string.cancel); 
     assertEquals("Cancel", cancelString); 
    } 

    public void testGermanLocale() { 
     setLocale("de", "DE"); 
     String cancelString = getContext().getString(R.string.cancel); 
     assertEquals("Abbrechen", cancelString); 
    } 

    public void testSpanishLocale() { 
     setLocale("es", "ES"); 
     String cancelString = getContext().getString(R.string.cancel); 
     assertEquals("Cancelar", cancelString); 
    } 

} 

Ecco i risultati di esecuzione in Eclipse:

enter image description here

Android O aggiornamento.

Quando si utilizza il metodo Android O Locale.setDefault(Category.DISPLAY, locale) (vedere behaviour changes per ulteriori dettagli).

+2

Grazie! Ciò dovrebbe offrire ai futuri utenti un punto di partenza migliore per i test delle impostazioni internazionali. –

+1

Non estendo i miei test con AndroidTestCase, quindi non riesco a ottenere il contesto. Sto usando '@RunWith (RobolectricGradleTestRunner.class)'. Quindi sembra che non posso usare la stessa soluzione. Qualche consiglio? –