web-dev-qa-db-fra.com

AndroidHttpClient introuvable (lors de l'exécution de Robolectric)

J'ai mis en place un projet très simple pour tester l'intégration de Robolectric + Data Binding + Retrolambda. Lorsque je lance la combinaison de test, je reçois le message suivant:

Error:(30, 30) Gradle: error: cannot access AndroidHttpClient
class file for Android.net.http.AndroidHttpClient not found

C'est assez étrange puisque je n'utilise nulle part AndroidHttpClient.


L'erreur se produit ici, sur la ligne "activité":

@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);
}

Le programme n'utilise jamais AndroidHttpClient. En fait, voici le programme complet:

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

Des idées sur ce qui ne va pas?

29
Technocrat

AndroidHttpClient a été supprimé du SDK dans la v23 des outils de génération.

Robolectric fonctionnant par rapport à des versions antérieures, il s'attend à ce qu'il soit présent. C'est pourquoi vous voyez cette erreur.

Pour l'instant, vous pouvez le rajouter dans:

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

Comme détaillé ici .

Robolectric a ouvert un billet GitHub pour résoudre ce problème. Vous pouvez suivre le fil/ticket ici .

Mettre à jour:

Comme certaines personnes l'ont bien fait remarquer, une meilleure façon de procéder consiste à créer une classe Android.net.http.AndroidHttpClient dans vos ressources de test. Cette méthode serait préférable car vous ne modifiez que les sources de test, pas le code de production, afin de prendre en charge les tests.

46
Ben Pearson

Je viens d'ajouter de fausses classes Android.net.http.AndroidHttpClient dans mes sources de test. Et cela a résolu le problème pour le moment. En attente de mise à jour de Robolectric

17
Eugen Martynov

Problème apparent et solution: 

AndroidHttpClient a été supprimé du SDK dans l'API niveau 23, tandis que Robolectric était configuré pour exécuter des tests avec le SDK 21:

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

J'ai pu résoudre ce problème en créant une nouvelle classe appelée AndroidHttpClient dans un nouveau package Android.net.http. Après cela, j'ai dû annoter ma classe de tests unitaires avec @Config(constants = BuildConfig.class, sdks = 21), qui exécutera les tests sur une version émulée de l'API 21, qui est la dernière version d'Android prise en charge par Robolectric.

Il y a actuellement un problème ouvert ici , donc une fois la version 3.1 publiée, tout devrait bien se passer et vous n'aurez plus à utiliser cette solution de contournement.

5
CodyEngel

Si le SDK cible est 28, alors selon this , nous devons mettre la ligne suivante dans AndroidManifest.xml

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