Androidアプリを開発していて、とあるAPIから取得したJSON情報をパースしようとJSONObjectを利用したのですが、そのクラスのローカルユニットテストを実行したらNulllPointerExceptionとなってしまい大分ハマってしまったので対処法を紹介します。

JSONObjectでjson文字列を解析しても”null”しか取得できない

やろうとしたことは単純で、以下のコードのようにJSONObject使ってjson文字列を引数にインスタンスを作っただけです。しかし、これをデバックモードで見てみると作成したJSONObjectインスタンスが”null”になってしまっていました。

ちなみに実機ではなく、ローカルユニットテストでテストしたときの結果にがこのような事象になってしまっています。

JSONObject json = new JSONObject(jsonString); //ここでインスタンスが"null"となってしまう
JSONObject item1 = json.getJSONObject("item1"); //ここでnullポ

原因は ローカルユニットテストではAndroidのライブラリを利用できないということだった

Androidのユニットテストには2種類あります。1つはエミュレータや実機などのAndroidを必要としない「ローカルユニットテスト」、もう一つはAndroidで動かす必要のある「インストルメント化されたテスト」です。

ローカルユニットテストは実機やエミュレータなしで簡単に実行できますがAndroidフレームワークを利用したライブラリを利用することができません。JSONObjectはAdnroidフレームワークのクラスであるため、JSONObjectをローカルユニットテストで実行したことが原因でした。

対処としてはインストルメント化されたテストで実行すると正常動作する

対処としては、JSONObjectを利用するクラスのテストは「インストルメント化されたテスト」の方で実行する必要があります。ただこれだけですが、気付くまで結構時間を食ってしまったのでAndroidのテストはいろいろめんどいです。