2013-05-26 11 views
16

テストしたいコードがあります。私はリソース内にあるさまざまな文字列から文字列が正しく構成されているかどうかを確認したい。ここでの課題は、自分のリソースで複数の翻訳を扱うことです。ロケールはデスクトップアプリケーションをテストする際に問題になる可能性があり、ロケールに依存しないテストを作成することをお勧めします。Androidで単体テスト中のロケール

ロケールをプログラムで設定できることがわかりましたが、推奨されていませんでした(Change language programmatically in Android参照)。この質問は、アプリケーションを正常に実行しているときに実行時にロケールを変更することを目的としていましたが、私の問題に対するより良い解決策があるかどうかは疑問でした。

+0

私はまた、これに興味があるので、奨励金です。私の特質:私はEclipse内からテストしています。スイート内でできるだけスムーズにタイムゾーンを含むロケールを変更したいと考えています。私は答えでそれを行う方法の実例を見たいと思います。 –

+0

@MattGibson私は実際の例で私の答えを更新しました。これは、日付フォーマッタとアプリケーションリソースの両方のロケールを変更します。 –

答えて

37

テスト用の場合は、問題なくロケールをプログラムで変更できます。アプリの設定が変更され、新しいロケールでコードをテストすることができます。ユーザーが変更した場合と同じ効果があります。テストを自動化する場合は、adb shelldescribed hereとしてロケールを変更するスクリプトを作成し、その後にテストを開始することができます。ここで

は、英語、ドイツ語、スペイン語のロケールのために "キャンセル" 単語のテスト翻訳の例である:ここで

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

アンドロイドOアップデート。

Android OのメソッドLocale.setDefault(Category.DISPLAY, locale)で実行している場合は、詳しくはbehaviour changesを参照してください。

+2

ありがとう!これにより、今後の検索ユーザーにロケールテストの出発点が与えられるはずです。 –

+1

私はAndroidTestCaseでテストを拡張しないので、コンテキストを取得できません。 私は '@RunWith(RobolectricGradleTestRunner.class)'を使用しています。だから私は同じソリューションを使用することができないようです。何かアドバイス? –

関連する問題