2015-08-07 6 views
5

ho aggiunto le seguenti dipendenze al mio progetto Android:Ottenere junit.framework.AssertionFailedError: Nessun test si trovano in [pacchetto] quando si utilizzano unità e Mockito

// Unit testing dependencies 
androidTestCompile 'junit:junit:4.12' 
// Set this dependency if you want to use Mockito 
androidTestCompile 'org.mockito:mockito-core:1.10.19' 

e creare un test utilizzando api Junit4 (un esempio, Adder è una semplice classe che riassume interi):

@RunWith(MockitoJUnitRunner.class) 
public class AdderTest { 

    @Test 
    public void testValidAdd() { 
     Adder adder = new Adder(); 
     assertEquals(adder.add(1,1), 2); 
    } 
} 

Quando provo ad eseguire il test, ottengo:

Running tests Test running started junit.framework.AssertionFailedError: No tests found in com.test.myapp.AdderTest at android.test.AndroidTestRunner.runTest(AndroidTestRunner.java:191) at android.test.AndroidTestRunner.runTest(AndroidTestRunner.java:176) at android.test.InstrumentationTestRunner.onStart(InstrumentationTestRunner.java:554) at android.app.Instrumentation$InstrumentationThread.run(Instrumentation.java:1701) Finish

Ho letto here e here, ma nulla aiuta.

Qualcuno vede cosa sto facendo male/ha qualche input?

+0

I test di unità appartengono alla cartella 'test', quindi utilizzare' testCompile'. Inoltre, non è necessario '@RunWith (MockitoJUnitRunner.class)'. –

+0

Questo era solo un esempio. Ho bisogno nel mio progetto originale di usare i mock. Inoltre, il codice che sto testando utilizza android.util.Patterns.EMAIL_ADDRESS e restituisce null quando lo eseguo come test unitario. Se lo eseguo come test di una strumentazione Android, non restituirà l'abbinamento attuale? – dors

+0

Pubblica il tuo codice per chiarezza. Dovresti usare Robolectric per il test dell'unità.Strumenterà le classi di cui hai bisogno in modo da non aver bisogno di simulazioni * per tutto *. –

risposta

2

Stai utilizzando un test di Strumentazione Android. Per impostazione predefinita, il test runner Android non viene eseguito su JUnit4, viene eseguito su JUnit3 utilizzando sottoclassi di InstrumentationTestCase.

Avrete bisogno di ripristinare le chiamate manuali a MockitoAnnotations.initMocks(), con una chiamata di demolizione opzionale a Mockito.validateMockitoUsage(). Naturalmente, le chiamate direttamente a Mockito.mock (e simili) funzioneranno comunque.

In alternativa, è disponibile un official JUnit4 runner, che può essere installato dallo Android Support Test Library. Se si richiama questa strumentazione anziché il test runner predefinito, è possibile eseguire i test JUnit4 sul dispositivo, incluso l'utilizzo di MockitoJUnitRunner o MockitoRule.

+0

In realtà, il runner predefinito per i moderni progetti gradle Android è ora Junit 4. –

+1

@IgorGanapolsky Certo, ma solo se si imposta il runner di prova della strumentazione come risposta di Szymon. Il runner integrato è JUnit3.8, quindi è necessario eseguire l'override; una volta annullato, stai utilizzando la libreria di test di supporto Android come nella mia risposta. –

16

Questi non sono test unitari, sono test di strumentazione. Ho avuto lo stesso problema e risolto con l'aggiunta di queste righe per build.gradle del modulo:

android { 
    ... 
    sourceSets { 
     ... 
     defaultConfig { 
      testInstrumentationRunner 'android.support.test.runner.AndroidJUnitRunner' 
     } 
    } 
} 

È necessario aggiungere il corridore in dipendenze, vi suggerisco di caffè espresso:

androidTestCompile 'com.android.support.test.espresso:espresso-core:2.0' 

EDIT:

Ho dimenticato l'annotazione. Basta rimuovere @RunWith e rendere un metodo @Before con la linea:

MockitoAnnotations.initMocks(this); 

o:

System.setProperty("dexmaker.dexcache", InstrumentationRegistry.getTargetContext().getCacheDir().getPath()); 

devo parlare in questo modo non è raccomandato. Per utilizzare il secondo, è necessario aggiungere le dipendenze con dex-maker per Mockito:

androidTestCompile ('com.google.dexmaker:dexmaker-mockito:1.2') { 
     exclude module: 'mockito-core' 
    } 

Dal momento che avete aggiunto Mockito, dobbiamo escludere nucleo Mockito dalla nuova dipendenza. Contiene già il normale modulo dex-maker.

+1

@IgorGanapolsky La linea che stai cercando è in [app/build.gradle] (https://github.com/googlesamples/android-topeka/blob/master/app/build.gradle#L29). Questo sembra supportare l'affermazione che è richiesta la direttiva 'testInstrumentationRunner'. –

Problemi correlati