2015-09-24 17 views
27

Ho creato un progetto molto semplice per testare l'integrazione di Robolectric + Data Binding + Retrolambda. Quando eseguo la prova costume, ricevo il seguente messaggio:AndroidHttpClient non trovato (durante l'esecuzione di Robolectric)

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

questo è abbastanza strano dato che io non uso AndroidHttpClient da nessuna parte.


L'errore si verifica qui, sulla linea "attività":

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

Il programma non usa mai AndroidHttpClient. In realtà, questo è l'intero programma:

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

idee su ciò che c'è di sbagliato?

+3

'AndroidHttpClient' è stato rimosso dall'SDK nel livello API 23, quindi se il tuo' compileSdkVersion' è 23 o superiore, ciò spiegherebbe perché la classe non viene trovata. Per quanto riguarda il motivo per cui Robolectric sta cercando di accedere a quella classe, che non posso dire. – CommonsWare

+0

Che risolto! Stavo eseguendo i test con: "@Config (constants = BuildConfig.class, sdk = 21)". Grazie! – Technocrat

+0

Scrivi una risposta in modo che tutti possano beneficiare –

risposta

43

AndroidHttpClient stata cancellata dal SDK V23 degli strumenti di compilazione.

Poiché Robolectric è in esecuzione su versioni precedenti, si aspetta che sia lì, motivo per cui si sta verificando questo errore.

Per il momento, è possibile aggiungerlo di nuovo in:

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

Come dettagliata here.

C'è un ticket GitHub aperto per Robolectric per risolvere questo problema. È possibile seguire il thread/ticket here.

+6

Si prega di non farlo. Aggiungendo una libreria obsoleta, stai gonfiando la tua app con un codice che viene usato solo per i test. –

+0

Errore: esecuzione non riuscita per l'attività ': app: transformClassesWithJarMergingForDebug'. > com.android.build.api.transform.TransformException: java.util.zip.ZipException: duplicato voce: org/apache/http/ConnectionClosedException.class –

5

apparente problema e la soluzione:

AndroidHttpClient stato rimosso dal SDK API livello 23, mentre Robolectric stato impostato per eseguire i test con SDK 21:

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

Mi sto imbattendo nello stesso problema, qual è stata la soluzione effettiva? Per me compilare con API Level 22 probabilmente non è una risposta. –

+0

Come ricordo, il problema AndroidHttpClient è stato causato da una discrepanza tra la versione di sdk impostata per robolectric (21) e compileSdkVersion (23).Tuttavia, ho scritto il progetto per valutare la libreria di raccolta dati e ho concluso che c'erano ancora troppi problemi. – Technocrat

16

Ho appena aggiunto la classe contraffatta android.net.http.AndroidHttpClient nelle mie origini di test. E ha risolto il problema per ora. In attesa di aggiornamento di Robolectric

+1

Questo lo ha risolto per me con il livello minimo di impatto. L'uso di 'useLibrary' comporta che elementi extra vengano raggruppati nell'app principale mentre l'aggiunta di questa classe in' src/test/java' non ha alcun impatto sull'applicazione principale. –

5

Sono stato in grado di risolvere questo problema creando una nuova classe chiamata AndroidHttpClient all'interno di un nuovo pacchetto android.net.http. Successivamente ho dovuto annotare la mia lezione di Unit Test con @Config(constants = BuildConfig.class, sdks = 21) che eseguirà i test su una versione emulata dell'API 21 che è l'ultima versione di Android Robolectric attualmente supportata.

Attualmente è stato aperto un problema here, quindi una volta rilasciata la versione 3.1, tutto dovrebbe andare bene e non sarà necessario utilizzare questa soluzione alternativa.

Problemi correlati