アプリケーションで奇妙なバグが発生しています。をMyApplication
拡張するクラスがありApplication
ます。そのonCreate()
メソッドでは、文字列リソース ファイルに格納された API キーを必要とするいくつかのサード パーティ ライブラリを初期化します。基本的に、Nexus S と Galaxy SIII でテストできるデバイスで問題なく動作します。しかし、クラッシュ レポート システムからいくつかのエントリを取得しました。Robolectric テストを実行すると、メソッドMyApplication.onCreate()
から NullPointerException が発生しgetString()
ます。
誰かが同じ問題を抱えていたのだろうか、何が原因なのだろうか?
テスト用のログ出力 (クラッシュ レポートも の同じ行をsetupAnalyticsCrashReportingAndThirdPartySdks
参照):
java.lang.NullPointerException
at org.robolectric.shadows.ShadowResources.getResName(ShadowResources.java:100)
at org.robolectric.shadows.ShadowResources.getString(ShadowResources.java:130)
at android.content.res.Resources.getString(Resources.java)
at org.robolectric.shadows.ShadowContext.getString(ShadowContext.java:54)
at android.content.Context.getString(Context.java)
at com.myapp.android.MyApplication.setupAnalyticsCrashReportingAndThirdPartySdks(MyApplication.java:113)
at com.myapp.android.MyApplication.onCreate(MyApplication.java:42)
at com.myapp.android.util.UtilitiesTest.setUp(UtilitiesTest.java:44)
at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:44)
at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:15)
at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:41)
at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:27)
at org.robolectric.RobolectricTestRunner$2.evaluate(RobolectricTestRunner.java:106)
at org.junit.runners.BlockJUnit4ClassRunner.runNotIgnored(BlockJUnit4ClassRunner.java:79)
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:71)
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:49)
at org.junit.runners.ParentRunner$3.run(ParentRunner.java:193)
at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:52)
at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:191)
at org.junit.runners.ParentRunner.access$000(ParentRunner.java:42)
at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:184)
at org.junit.runners.ParentRunner.run(ParentRunner.java:236)
at org.junit.runner.JUnitCore.run(JUnitCore.java:157)
at com.intellij.rt.execution.junit.JUnitStarter.main(JUnitStarter.java:63)
更新: コードの一部:
public class MyApplication extends Application
{
private static MyApplication _instance;
@Override
public void onCreate()
{
super.onCreate();
setupAnalyticsCrashReportingAndThirdPartySdks();
}
public MyApplication()
{
_instance = this;
}
public static MyApplication getInstance()
{
return _instance;
}
private void setupAnalyticsCrashReportingAndThirdPartySdks()
{
String env = getString(R.string.environment); // Crash here
if (env != null && env.equalsIgnoreCase("dev"))
{
FlurryAnalytics.setDebugMode(true);
}
}
}