2015-03-17 20 views
10

Sono nuovo per Android Studio. Sto usando Android Studio 1.2 preview 2, gradle 2.2.1 e gradle plugin 1.1.0.Test delle unità su Android Studio: errore "not mocked"

non riesco a risolvere questo errore, quando si tenta di eseguire il mio test di unità:

java.lang.RuntimeException: Method getInstrumentation in android.test.InstrumentationTestCase not mocked 

Questa è la mia classe di test:

public class AppPreferencesTest extends InstrumentationTestCase { 

AppPreferences preferences; 

@Before 
public void setUp() throws Exception { 
    preferences = new AppPreferences(getInstrumentation().getTargetContext()); 
} 

... 

Nel mio build.gradle:

testCompile 'junit:junit:4.12' 

Ho provato ad aggiungere questo

testOptions { 
    unitTests.returnDefaultValues = true 
} 

perché è stato menzionato nei passaggi che ho seguito a http://tools.android.com/tech-docs/unit-testing-support ma non lo aggiusta.

Ho provato anche la creazione di un MockContext:

preferences = new AppPreferences(new MockContext()); 

ma il costruttore di AppPreferences che dà un errore

public AppPreferences(Context context) { 
    preferences = PreferenceManager.getDefaultSharedPreferences(
      context); 
} 

...

RuntimeException: Method getDefaultSharedPreferences in android.preference.PreferenceManager not mocked. 

risposta

3

non ho potuto ottenere i test di strumentazione di lavoro, utilizzando Android Studio, immagino che stanno ancora finalizzare l'attuazione. E poiché ha bisogno di essere eseguito sull'emulatore, ci sono opzioni più veloci: test di unità regolari.

Grazie ai suggerimenti di Jared, sono passato a Robolectric, che è facile da usare su Android Studio.

androidTestCompile 'junit:junit:4.12' 
androidTestCompile "org.robolectric:robolectric:3.0" 

e

import org.junit.Before; 
import org.junit.Test; 
import org.junit.runner.RunWith; 
import org.robolectric.RuntimeEnvironment; 
import org.robolectric.RobolectricTestRunner; 
import static junit.framework.TestCase.assertEquals; 

@RunWith(RobolectricTestRunner.class) 
public class AppPreferencesTest { 

    AppPreferences preferences; 

    @Before 
    public void setUp() throws Exception { 
     preferences = new AppPreferences(RuntimeEnvironment.application.getApplicationContext()); 
    } 

    @Test 
    public void testIsNotificationsEnabled_Default() throws Exception { 
     assertEquals(true, preferences.isNotificationsEnabled()); 
    } 

    ... 

Le informazioni qui sembra essere corretta in questo momento: http://nenick-android.blogspot.nl/2015/02/android-studio-110-beta-4-and.html Ma probabilmente deprecate di nuovo nel prossimo futuro, come tutte le informazioni che ho trovato su questo argomento utilizzando google già deprecato.

+11

"Grazie ai consigli di Jared". Eppure, ti sei dato credito. –

+0

Perché RobolectricTestRunner è migliore di MockitoJunitRunner? –

+0

Si prende gioco di tutte le classi specifiche di Android facilmente, come in contesti. – Frank

9

Vedo che hai aggiornato il tuo domanda.

Si prega di dare un'occhiata alla fonte di questo SharedPreferencesMockContext.java: https://github.com/applicake/Beandroid/blob/master/Beanstalk%20Android%20ClientTest/src/com/applicake/beanstalkclient/test/SharedPreferencesMockContext.java.

Ecco il test: https://github.com/applicake/Beandroid/blob/master/Beanstalk%20Android%20ClientTest/src/com/applicake/beanstalkclient/test/NotificationsTests.java

Ecco uno spettacolo frammento di come hanno creato la loro Mock:

@Override 
    protected void setUp() throws Exception { 

    final SharedPreferencesMockContext mockContext = new SharedPreferencesMockContext(getContext()); 
    MockApplication mockApplication = new MockApplication(){ 
     @Override 
     public Context getApplicationContext() { 
     Log.d("tests", "Im here"); 
     return mockContext; 
     } 
    }; 


    context = mockContext; 
    setApplication(mockApplication); 
    prefs = PreferenceManager.getDefaultSharedPreferences(context); 
    prefs.edit().clear().commit(); 

    super.setUp(); 
    } 

mi sono imbattuto in questo errore la scorsa notte. Prova a utilizzare "MockContext".

public class AppPreferencesTest extends InstrumentationTestCase { 

AppPreferences preferences; 
Context context; 

@Before 
public void setUp() throws Exception { 
    context = new MockContext(); 
    preferences = new AppPreferences(context); 
} 

Si prega di vedere altri esempi qui: https://stackoverflow.com/a/29063736/950427

+0

Grazie, l'ho già provato prima, ma darà un altro errore all'interno del costruttore di AppPreferences, ho aggiunto questo sotto la mia domanda. – Frank

+1

@Frank Ho aggiornato la mia risposta. –

+0

Ma questo è un ServiceTestCase, che è un AndroidTestCase, che avrà bisogno di un emulatore? E deve essere un ServiceTestCase o qualcosa di simile, perché usa getContext() all'inizio del tuo snippet (a cui SharedPreferencesMockContext si limita a inoltrare). – Frank

Problemi correlati