2015-08-07 5 views
5

ich die folgenden Abhängigkeiten zu meinem Android-Projekt hinzugefügt:Erste junit.framework.AssertionFailedError: Keine gefundene Tests [Paket] bei der Verwendung von Einheit und 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' 

Und einen Test mit junit4 api erstellen (ein Beispiel, Adder ist eine einfache Klasse, die fasst ints):

@RunWith(MockitoJUnitRunner.class) 
public class AdderTest { 

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

Wenn ich versuche, den Test auszuführen, erhalte ich:

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

Ich lese here und here, aber nichts hilft.

Kann jemand sehen, was ich falsch mache/irgendwelche Eingabe?

+0

Komponententests gehören in den Ordner 'test'. Verwenden Sie daher' testCompile'. Außerdem benötigen Sie nicht die '@ RunWith (MockitoJUnitRunner.class)'. –

+0

Dies war nur ein Beispiel. Ich brauche in meinem ursprünglichen Projekt Mocks. Darüber hinaus verwendet der Code, den ich testen, android.util.Patterns.EMAIL_ADDRESS, und es gibt null zurück, wenn ich es als Komponententest ausführen. Wenn ich es als Android Instrumentierungstest laufen lasse, wird es nicht den tatsächlichen Matcher zurückgeben? – dors

+0

Posten Sie Ihren Code für Klarheit. Sie sollten Robolectric für Komponententests verwenden.Es instrumentiert die Klassen, die Sie brauchen, damit Sie keine Mocks * für alles brauchen *. –

Antwort

2

Sie verwenden einen Android-Instrumentationstest. Standardmäßig wird der Android-Test-Runner nicht auf JUnit4 ausgeführt, sondern auf JUnit3 mit den Unterklassen InstrumentationTestCase.

Sie müssen zu manuellen Anrufen zu MockitoAnnotations.initMocks() zurückkehren, mit einem optionalen Abbruchanruf unter Mockito.validateMockitoUsage(). Natürlich, Anrufe direkt an Mockito.mock (und so) wird immer noch funktionieren. Als Alternative gibt es eine official JUnit4 runner, die von der Android Support Test Library installiert werden kann. Wenn Sie diese Instrumentation anstelle des Standard-Testlaufwerks aufrufen, können Sie JUnit4-Tests auf Ihrem Gerät ausführen, einschließlich MockitoJUnitRunner oder MockitoRule.

+0

Eigentlich ist die Standard-Runner für moderne Android Gradle-Projekte jetzt Junit 4. –

+1

@IgorGanapolsky Sicher, aber nur, wenn Sie den Instrumentierungstestläufer als Szymons Antwort setzen. Der integrierte Runner ist JUnit3.8, daher ist weiterhin ein Override erforderlich. Sobald es außer Kraft gesetzt wurde, verwenden Sie die Android-Testbibliothek wie in meiner Antwort. –

16

Dies sind keine Komponententests, sie sind Instrumentierungstest. Ich hatte das gleiche Problem und löste es durch diese Zeilen Moduls build.gradle Zugabe:

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

Sie haben die Läufer in Abhängigkeiten hinzuzufügen, ich schlage vor, Sie Espresso:

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

EDIT:

Ich habe die Anmerkung vergessen. Nur @RunWith entfernen und eine @Before Methode mit Leitung auf:

MockitoAnnotations.initMocks(this); 

oder:

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

Ich habe diese Art und Weise zu erwähnen, ist nicht zu empfehlen. Um die zweite zu verwenden, müssen Sie Abhängigkeiten mit Dex-Maker für Mockito hinzufügen:

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

Da Sie Mockito hinzugefügt haben, müssen wir Mockito Kern der neuen Abhängigkeit auszuschließen. Es enthält bereits das normale Dex-Maker-Modul.

+1

@IgorGanapolsky Die Zeile, nach der Sie suchen, befindet sich in [app/build.gradle] (https://github.com/googlesamples/android-topeka/blob/master/app/build.gradle#L29). Dies scheint die Aussage zu unterstützen, dass die Anweisung "testInstrumentationRunner" erforderlich ist. –

Verwandte Themen