web-dev-qa-db-ja.com

AndroidHttpClientが見つかりません(Robolectricを実行している場合)

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("");
    });
}

何が問題なのか?

29
Technocrat

AndroidHttpClientは、ビルドツールのv23のSDKから削除されました。

Robolectricは以前のバージョンに対して実行されているため、Robolectricが存在することを期待しているため、このエラーが表示されます。

今のところ、それを再び追加することができます:

Android {
    useLibrary 'org.Apache.http.legacy'
}

詳細 こちら

これを修正するために、Robolectric向けのGitHubチケットが公開されています。スレッド/チケットをフォローできます here

更新:

一部の人々が正しく指摘しているように、これを行うより良い方法は、テストリソースにクラスAndroid.net.http.AndroidHttpClientを作成することです。テストに対応するためにプロダクションコードではなくテストソースのみを変更しているため、これは推奨される方法です。

46
Ben Pearson

偽のクラスを追加しましたAndroid.net.http.AndroidHttpClient私のテストソース。そして今のところ問題を解決しました。 Robolectricが更新されるのを待っています

17
Eugen Martynov

明らかな問題と解決策:

AndroidHttpClientはAPIレベル23でSDKから削除され、RobolectricはSDK 21でテストを実行するように設定されました。

AndroidHttpClient was removed from the SDK in API Level 23
5
Technocrat

新しいパッケージ_Android.net.http_内にAndroidHttpClientという新しいクラスを作成することで、この問題を解決できました。その後、ユニットテストクラスに@Config(constants = BuildConfig.class, sdks = 21)アノテーションを付けて、Android Robolectricが現在サポートしている最後のバージョンであるAPI 21のエミュレートバージョンに対してテストを実行します。

現在公開されている問題は here であるため、バージョン3.1がリリースされると問題なく動作し、この回避策を使用する必要はありません。

5
CodyEngel

ターゲットSDKが28の場合、 this に従って、AndroidManifest.xmlに次の行を追加する必要があります

<uses-library Android:name="org.Apache.http.legacy" Android:required="false"/>
2
Naveed Ali