2015-02-13 18 views
6

Aggiornamento 1Impossibile utilizzare FakeHttpLayer di Robolectric (NullPointerException quando si chiama getFakeHttpLayer)

Dopo aver rimosso la ServiceTestCase estendono della mia classe di test, ho modificato il mio file Gradle per cambiare il testInstrumentationRunner a org.robolectric.RobolectricTestRunner ma ottengo un altro errore:

Running tests 
Test running started 
Test running failed: Instrumentation run failed due to 'java.lang.NoSuchMethodException' 
Empty test suite. 

Ho cercato su Google ma non sono riuscito a scoprire perché ho ricevuto questo messaggio di errore. Qui è l'intero file Gradle:

apply plugin: 'com.android.application' 

android { 
    compileSdkVersion 19 
    buildToolsVersion "21.1.2" 

    defaultConfig { 
     applicationId "foo.bar.testappsdk" 
     minSdkVersion 9 
     targetSdkVersion 19 

     testApplicationId "novom.anyware.anywaresdk.test" 
     testInstrumentationRunner "org.robolectric.RobolectricTestRunner" 
    } 

    buildTypes { 
     release { 
      minifyEnabled false 
      proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.txt' 
     } 
    } 

    packagingOptions { 
     exclude 'META-INF/LICENSE.txt' 
     exclude 'META-INF/LICENSE' 
     exclude 'META-INF/NOTICE' 
     exclude 'LICENSE.txt' 
    } 

    sourceSets { 
     instrumentTest.setRoot('src/androidTest') 
    } 
} 

dependencies { 
    compile 'com.android.support:support-v4:19.1.0' 
    compile 'com.android.support:appcompat-v7:19.1.0' 
    compile 'com.google.android.gms:play-services:6.5.87' 
    compile 'novom.anyware.anywaresdk:[email protected]' 
    androidTestCompile 'com.jayway.android.robotium:robotium-solo:5.2.1' 
    androidTestCompile 'org.robolectric:robolectric:2.4' 
    androidTestCompile 'junit:junit:4.12' 
} 

Fine dell'aggiornamento 1


Sto cercando di utilizzare Robolectric 2.4 per testare le chiamate di rete della mia biblioteca Android. Il problema è che non riesco nemmeno ad accedere a FakeHttpLayer di Robolectric senza ottenere NullPointerException.

java.lang.NullPointerException: Attempt to invoke virtual method 'org.robolectric.tester.org.apache.http.FakeHttpLayer org.robolectric.shadows.ShadowApplication.getFakeHttpLayer()' on a null object reference 
at org.robolectric.Robolectric.getFakeHttpLayer(Robolectric.java:1239) 
at novom.anyware.anywaresdk.test.AWRSyncServiceTest.test_3_get_config(AWRSyncServiceTest.java:61) 
at android.test.AndroidTestRunner.runTest(AndroidTestRunner.java:191) 
at android.test.AndroidTestRunner.runTest(AndroidTestRunner.java:176) 
at android.test.InstrumentationTestRunner.onStart(InstrumentationTestRunner.java:555) 
at android.app.Instrumentation$InstrumentationThread.run(Instrumentation.java:1837) 

C'è la mia classe di prova:

@RunWith(RobolectricTestRunner.class) 
public class AWRSyncServiceTest extends ServiceTestCase<AWRSyncService> { 
    private static final String TAG = "AWRSyncServiceTest"; 

    private AWRSyncService syncService; 

    public AWRSyncServiceTest() { 
     super(AWRSyncService.class); 
    } 

    @Override 
    protected void setUp() throws Exception { 
     Log.d(TAG, "setUp"); 
     super.setUp(); 
     IBinder service = bindService(new Intent(getContext(), AWRSyncService.class)); 
     AWRSyncService.SyncServiceBinder binder = (AWRSyncService.SyncServiceBinder) service; 
     syncService = binder.getService(); 
    } 

    @Override 
    protected void tearDown() throws Exception { 
     Log.d(TAG, "tearDown"); 
     super.tearDown(); 
    } 

    public void test_1_preconditions() { 
     Log.d(TAG, "test_1_preconditions"); 
     assertNotNull(syncService); 
     assertNotNull(syncService.getApplicationContext()); 
    } 

    public void test_3_get_config() { 
     Robolectric.getFakeHttpLayer(); 
    } 

} 

mi manca un po 'di configurazione di base che deve essere impostata su Robolectric prima di essere in grado di usarlo? Non riesco a trovare alcun buon tutorial che mi aiuti a capire cosa ho fatto di sbagliato.

Grazie

+0

Hai trovato qualche soluzione? – Dory

+0

No, ho rinunciato a Robolectric. –

+0

Quindi hai qualche altro framework per le chiamate a riposo? Puoi per favore guidarmi? – Dory

risposta

2

Non so se questo è il motivo per cui si dispone di questo problema specifico, ma un problema è che si sta estendendo un ServiceTestCase. Questo è un problema, perché ora stai mescolando Robolectric con i test delle unità Android.

I test di Robolectric vengono eseguiti sulla JVM, non sul dispositivo. Test dell'unità Android eseguiti sul dispositivo.

Si potrebbe anche voler controllare questo fuori in termini di come mettere alla prova il vostro servizio: http://robolectric.org/starting-components/

+0

Ho anche provato senza Android unit test, ma non posso farlo per trovare le mie prove ... Continuo a ricevere questo messaggio di errore 'junit.framework.AssertionFailedError: Nessun test si trovano in novom.anyware.anywaresdk.test.AWRSyncServiceTest' e non ho trovato alcun tutorial che mi abbia aiutato a risolvere questo problema. Penso che sarà più facile continuare a utilizzare i test delle unità Android e rifattorizzare il mio codice un po 'per riuscire a prendere in giro le mie chiamate di rete. –

+0

Hai fatto un'annotazione @Test per i tuoi test? JUnit4 non li abbina con il nome del metodo come JUnit 3. –

+0

Sì, ho due test che hanno l'annotazione '@ Test', ma è inutile. –

1

Probabilmente è perché si sta estendendo dalla classe ServiceTestCase. Non utilizzare la suite di test dell'unità Android per questo. Anche essere sicuri di aver creato quella classe su JUnit 4.

Un'altra cosa è che si dovrebbe costruire il servizio con il modo Robolectric. Come questo;

Robolectric.buildService(AWRSyncService.class).bind()

EDIT: Aggiungi questi campi per il file build.gradle, questi sono da robolectric gradle plugin

buildscript { 
    repositories { 
     mavenCentral() 
    } 

    dependencies { 
     classpath 'org.robolectric:robolectric-gradle-plugin:0.13.2' 
    } 
} 

apply plugin: 'robolectric' 

android { 
sourceSets { 
    androidTest { 
     setRoot('src/androidTest') 
    } 
} 

robolectric { 
    include '**/*Test.class' 
} 
+0

La tua risposta è molto simile a quella che Alex Florescu ha già dato. Non riesco a trovare Android Studio per trovare i miei test ... La mia classe ora non estende altre classi, ha l'annotazione '@RunWith (RobolectricTestRunner.class)', costruisco il mio servizio con 'Robolectric.buildService' e i miei test hanno l'annotazione '@ Test' ma continuo a ricevere il messaggio di errore' junit.framework.AssertionFailedError: Nessun test trovato in novom.anyware.anywaresdk.test.AWRSyncServiceTest' –

+0

Ho modificato il mio messaggio sopra – Deliganli

+0

Ho provato a modificare i file gradle per adattarli hai dato per esempio, ma continuo ad avere errori nelle versioni gradle ... E non voglio davvero cambiare completamente i miei file gradle, dal momento che ho bisogno che loro costruiscano la mia app per testare la mia libreria e ho anche un file di test che utilizza gli strumenti di test dell'unità Android. Integrare Robolectric è troppo complicato per quello che dà, preferirei rifattorizzare le mie classi per utilizzare gli strumenti di test delle unità Android. Ho provato per più di un giorno a usare Robolectric senza successo ... Non mi piace. grazie per l'aiuto –

Problemi correlati