2015-09-24 11 views
27

Ich habe ein sehr einfaches Projekt eingerichtet, um die Integration von Robolectric + Data Binding + RetroLambda zu testen. Wenn ich den Test Anzug laufen lasse, erhalte ich folgende Meldung:AndroidHttpClient nicht gefunden (wenn Robolectric läuft)

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

Diese ziemlich seltsam ist, da ich AndroidHttpClient nicht überall verwenden.


Der Fehler tritt hier auf der "Aktivität" Linie:

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

Das Programm nie AndroidHttpClient verwendet. In der Tat ist dies das gesamte Programm:

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

Ideen, was falsch ist?

+3

'AndroidHttpClient' wurde aus dem SDK in API Level 23 entfernt. Wenn also' compileSdkVersion' 23 oder höher ist, würde das erklären, warum die Klasse nicht gefunden wurde. Warum Robolectric versucht, auf diese Klasse zuzugreifen, kann ich nicht sagen. – CommonsWare

+0

Das hat es behoben! Ich habe die Tests mit: "@Config (constants = BuildConfig.class, sdk = 21)" ausgeführt. Vielen Dank! – Technocrat

+0

Schreiben Sie eine Antwort, damit alle profitieren –

Antwort

43

AndroidHttpClient aus dem SDK in v23 entfernt wurde der Build-Tools.

Da Robolectric gegen frühere Versionen läuft, erwartet es, dass es da ist, weshalb Sie diesen Fehler sehen.

Vorerst können Sie es hinzufügen zurück in:

android { 
    useLibrary 'org.apache.http.legacy' 
} 

Als detaillierte here.

Es ist ein GitHub-Ticket offen für Robolectric, um dies zu beheben. Sie können dem Thread/Ticket here folgen.

+6

Bitte tun Sie das nicht. Wenn Sie eine veraltete Bibliothek hinzufügen, blähen Sie Ihre App mit Code auf, der nur zum Testen verwendet wird. –

+0

Fehler: Ausführung fehlgeschlagen für Task ': app: transformClassesWithJarMergingForDebug'. > com.android.build.api.transform.TransformException: java.util.zip.ZipException: doppelten Eintrag: org/apache/http/ConnectionClosedException.class –

5

offensichtliches Problem und Lösung:

AndroidHttpClient aus dem SDK in API-Ebene entfernt wurde 23, während Robolectric gesetzt wurde 21 Tests mit SDK auszuführen:

AndroidHttpClient was removed from the SDK in API Level 23 
+0

Ich renne in das gleiche Problem, was war die tatsächliche Lösung? Für mich ist das Kompilieren mit API Level 22 wahrscheinlich keine Antwort. –

+0

Wie ich mich erinnere, wurde das AndroidHttpClient-Problem durch eine Diskrepanz zwischen der SDK-Version für robolectric (21) und der CompileSdkVersion (23) verursacht.Ich schrieb jedoch das Projekt, um die Datenbindungsbibliothek zu bewerten, und schlussfolgerte, dass es immer noch zu viele Probleme gab. – Technocrat

16

Ich habe gerade falsche Klasse android.net.http.AndroidHttpClient in meinen Testquellen hinzugefügt. Und es hat das Problem für jetzt gelöst. Warten auf Robolectric zu aktualisieren

+1

Dies löste es für mich mit der minimalen Auswirkungen. Die Verwendung von 'useLibrary' führt dazu, dass zusätzliche Objekte in Ihrer Haupt-App gebündelt werden, während das Hinzufügen dieser Klasse unter' src/test/java' keine Auswirkungen auf die Haupt-App hat. –

5

Ich konnte dieses Problem lösen, indem Sie eine neue Klasse namens AndroidHttpClient in einem neuen Paket android.net.http erstellen. Danach musste ich meine Unit-Test-Klasse mit @Config(constants = BuildConfig.class, sdks = 21) kommentieren, die die Tests gegen eine emulierte Version von API 21 ausführen wird, die die letzte Version von Android ist, die Robolectric derzeit unterstützt.

Es ist derzeit ein Problem here geöffnet, so, sobald sie Version 3.1 freigeben, sollte alles in Ordnung sein, und Sie müssen diese Problemumgehung nicht verwenden.