web-dev-qa-db-ja.com

Androidのユニットテスト中のロケール

テストしたいコードがいくつかあります。リソースにあるさまざまな文字列から文字列が適切に構成されているかどうかを確認したいと思います。ここでの課題は、私のリソースで複数の翻訳を処理することです。デスクトップアプリケーションをテストするときにロケールが問題になる可能性があることを知っています。ロケールに依存しないテストを作成することをお勧めします。

プログラムでロケールを設定できることがわかりましたが、お勧めしませんでした( Androidでプログラムで言語を変更する を参照)。この質問は、アプリを通常どおり実行するときに実行時にロケールを変更することを目的としていますが、問題に対するより良い解決策があるかどうか疑問に思いました。

27
Xilconic

テスト専用の場合は、問題なくプログラムでロケールを変更できます。アプリの構成が変更され、新しいロケールでコードをテストできるようになります。ユーザーが変更した場合と同じ効果があります。テストを自動化したい場合は、_adb Shell_を ここで説明 として使用してロケールを変更するスクリプトを記述し、後でテストを起動できます。

英語、ドイツ語、スペイン語のロケールで単語「キャンセル」の翻訳をテストする例を次に示します。

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

}
_

Eclipseでの実行結果は次のとおりです。

enter image description here

Android Oアップデート

Android OメソッドLocale.setDefault(Category.DISPLAY, locale)で実行する場合は、使用する必要があります(詳細については、 動作の変更 を参照してください)。

50