2015-03-12 14 views
6

Viene visualizzato il seguente errore quando si esegue un test JUnit su un'app Android che utilizza apachehttp-client. L'app viene eseguita correttamente durante il test dispositivo e su un emulatore. Un test di accesso JUnit passa ma il resto dei test JUnit fallisce ogni volta che l'app tenta di utilizzare apachehttp-client per leggere i dati da un server.JUnit UnsatisfiedLinkError: android.util.Log.isLoggable (Ljava/lang/String;

Il test sembra non riuscire a httpClient.execute

try { 
     URL businessPartnersResource = new URL(
       session.getServer().getUrl(), "BusinessPartners"); 

     HttpGet request = new HttpGet(businessPartnersResource.toURI()); 
     session.attachToRequest(request); 

     HttpClient httpClient = HttpClientFactory.getClient(); 
     HttpResponse response = httpClient.execute(request); 

     int status = response.getStatusLine().getStatusCode(); 

     switch (status) { 
     case HttpsURLConnection.HTTP_OK: { 

Ecco il mancato Trace

java.lang.UnsatisfiedLinkError: android.util.Log.isLoggable(Ljava/lang/String;I)Z 
at android.util.Log.isLoggable(Native Method) 
at org.apache.http.client.protocol.RequestClientConnControl.process(RequestClientConnControl.java:76) 
at org.apache.http.protocol.BasicHttpProcessor.process(BasicHttpProcessor.java:251) 
at org.apache.http.protocol.HttpRequestExecutor.preProcess(HttpRequestExecutor.java:168) 
at org.apache.http.impl.client.DefaultRequestDirector.execute(DefaultRequestDirector.java:458) 
at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:641) 
at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:576) 
at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:554) 

risposta

6

Frustrante, ma dovrai usare uno RobolectricTestRunner invece dello standard JUnit.

isLoggable è un metodo nativo che non è disponibile in fase di esecuzione.

Se si utilizza Volley o l'apachehttp-client, il problema più grande è che isLoggable si chiama come un istanziazione campo, ad esempio:

private static final DEBUG = Log.isLoggable(..);

Che scombina completamente le cose, dato che questo metodo è semplicemente non disponibile per tutte le librerie in fase di runtime, quindi anche un AndroidTestCase non può salvarti.

Fortunatamente, Robolectric lo gestisce perfettamente.

Edit 4 apr 2017

JUnit 5 è già disponibile e non ho ancora testato con questo testrunner.

-3

Esecuzione dei test JUnit su progetti Android.

L'unica differenza durante l'esecuzione di test di junit in Android è che si chiamerà Esegui come> Test JUnit Android anziché solo JUnit Test come in Java.

Questo è tutto! Spero ti piaccia!

1

Ho avuto lo stesso problema, prova ad estendere AndroidTestCase nella tua classe di test. L'errore è dovuto alle classi che possono essere trovate solo su Android Runtime (Device \ Emulator)

Problemi correlati