Robolectric + Data Binding + Retrolambdaの統合をテストするための非常に単純なプロジェクトをセットアップしました。テストスーツを実行すると、次のメッセージが表示されます。
Error:(30, 30) Gradle: error: cannot access AndroidHttpClient
class file for Android.net.http.AndroidHttpClient not found
どこでもAndroidHttpClientを使用しないので、これはかなり奇妙です。
ここで、「アクティビティ」行でエラーが発生します。
@Before
public void setup() {
activity = Robolectric.setupActivity(MainActivity.class); // Error on this line
textView = (TextView) shadowOf(activity).findViewById(R.id.textView);
button = (Button) activity.findViewById(R.id.button);
editText = (EditText) activity.findViewById(R.id.editText);
}
プログラムはAndroidHttpClientを使用しません。実際、これはプログラム全体です。
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
final ActivityMainBinding binding = DataBindingUtil.setContentView(this, R.layout.activity_main);
binding.setUser(new User());
binding.button.setOnClickListener((v) -> {
binding.textView.setText(String.format("Hello, %s!", binding.editText.getText()));
binding.editText.setText("");
});
}
何が問題なのか?
AndroidHttpClient
は、ビルドツールのv23のSDKから削除されました。
Robolectricは以前のバージョンに対して実行されているため、Robolectricが存在することを期待しているため、このエラーが表示されます。
今のところ、それを再び追加することができます:
Android {
useLibrary 'org.Apache.http.legacy'
}
詳細 こちら 。
これを修正するために、Robolectric向けのGitHubチケットが公開されています。スレッド/チケットをフォローできます here 。
更新:
一部の人々が正しく指摘しているように、これを行うより良い方法は、テストリソースにクラスAndroid.net.http.AndroidHttpClient
を作成することです。テストに対応するためにプロダクションコードではなくテストソースのみを変更しているため、これは推奨される方法です。
偽のクラスを追加しましたAndroid.net.http.AndroidHttpClient
私のテストソース。そして今のところ問題を解決しました。 Robolectricが更新されるのを待っています
明らかな問題と解決策:
AndroidHttpClientはAPIレベル23でSDKから削除され、RobolectricはSDK 21でテストを実行するように設定されました。
AndroidHttpClient was removed from the SDK in API Level 23
新しいパッケージ_Android.net.http
_内にAndroidHttpClient
という新しいクラスを作成することで、この問題を解決できました。その後、ユニットテストクラスに@Config(constants = BuildConfig.class, sdks = 21)
アノテーションを付けて、Android Robolectricが現在サポートしている最後のバージョンであるAPI 21のエミュレートバージョンに対してテストを実行します。
現在公開されている問題は here であるため、バージョン3.1がリリースされると問題なく動作し、この回避策を使用する必要はありません。
ターゲットSDKが28の場合、 this に従って、AndroidManifest.xmlに次の行を追加する必要があります
<uses-library Android:name="org.Apache.http.legacy" Android:required="false"/>