Intro
Beachten Sie, dass Robolectric 2.4 zum Zeitpunkt des Schreibens die neueste Version ist und keine Unterstützung für die appcompat v7
Bibliothek bietet . Unterstützung wird in Robolectric 3.0 hinzugefügt (noch keine ETA ). Auch ActionBar Sherlock
können Probleme mit robolectric verursachen.
Um Robolectric in Android Studio zu verwenden, haben Sie zwei Möglichkeiten:
(Option 1) - Ausführen von JUnit-Tests mit Android Studio unter Verwendung eines Java-Moduls
Diese Technik verwendet ein Java-Modul für alle Ihre Tests mit einer Abhängigkeit von Ihrem Android-Modul und einen benutzerdefinierten Testläufer mit etwas Magie:
Anweisungen finden Sie hier: http://blog.blundellapps.com/how-to-run-robolectric-junit-tests-in-android-studio/
Überprüfen Sie auch den Link am Ende dieses Beitrags, um die Tests von Android Studio auszuführen.
(Option 2) - Ausführen von JUnit-Tests mit Android Studio unter Verwendung des Robolectric-Gradle-Plugins
Ich habe einige Probleme beim Einrichten von Junit-Tests für die Ausführung von Gradle in Android Studio festgestellt.
Dies ist ein sehr einfaches Beispielprojekt zum Ausführen von Junit-Tests aus einem gradle-basierten Projekt in Android Studio: https://github.com/hanscappelle/android-studio-junit-robolectric Dies wurde mit Android Studio 0.8.14, JUnit 4.10, getestet. robolectric gradle plugin 0.13+ und robolectric 2.3
Buildscript (project / build.gradle)
Das Build-Skript ist die Datei build.gradle im Stammverzeichnis Ihres Projekts. Dort musste ich dem Klassenpfad das robolectric gradle plugin hinzufügen
buildscript {
repositories {
jcenter()
}
dependencies {
classpath 'com.android.tools.build:gradle:0.13.2'
classpath 'org.robolectric:robolectric-gradle-plugin:0.13.+'
}
}
allprojects {
repositories {
jcenter()
}
}
Projekt-Buildscript (App / build.gradle)
Verwenden Sie im Build-Skript Ihres App-Moduls das robolectric
Plugin, fügen Sie robolectric
config hinzu und fügen Sie androidTestCompile
Abhängigkeiten hinzu.
apply plugin: 'com.android.application'
apply plugin: 'robolectric'
android {
}
robolectric {
include '**/*Test.class'
exclude '**/espresso/**/*.class'
maxHeapSize = '2048m'
jvmArgs '-XX:MaxPermSize=512m', '-XX:-UseSplitVerifier'
ignoreFailures true
afterTest { descriptor, result ->
println "Executing test for {$descriptor.name} with result: ${result.resultType}"
}
}
dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
androidTestCompile 'org.robolectric:robolectric:2.3'
androidTestCompile 'junit:junit:4.10'
}
Erstellen Sie JUnit-Testklassen
Setzen Sie nun die Testklassen an den Standardspeicherort (oder aktualisieren Sie die Gradle-Konfiguration).
app/src/androidTest/java
Benennen Sie Ihre Testklassen, die mit Test enden (oder aktualisieren Sie die Konfiguration erneut), junit.framework.TestCase
und erweitern und kommentieren Sie die Testmethoden mit @Test
.
package be.hcpl.android.mytestedapplication;
import junit.framework.TestCase;
import org.junit.Test;
public class MainActivityTest extends TestCase {
@Test
public void testThatSucceeds(){
assert true;
}
@Test
public void testThatFails(){
assert false;
}
}
Tests ausführen
Führen Sie als Nächstes die Tests mit gradlew über die Befehlszeile aus (machen Sie sie chmod +x
bei Bedarf mit ausführbar ).
./gradlew clean test
Beispielausgabe:
Executing test for {testThatSucceeds} with result: SUCCESS
Executing test for {testThatFails} with result: FAILURE
android.hcpl.be.mytestedapplication.MainActivityTest > testThatFails FAILED
java.lang.AssertionError at MainActivityTest.java:21
2 tests completed, 1 failed
There were failing tests. See the report at: file:///Users/hcpl/Development/git/MyTestedApplication/app/build/test-report/debug/index.html
:app:test
BUILD SUCCESSFUL
Fehlerbehebung
alternative Quellverzeichnisse
So wie Sie Ihre Java-Quelldateien an einem anderen Ort haben können, können Sie Ihre Testquelldateien verschieben. Aktualisieren Sie einfach die Gradle- sourceSets
Konfiguration.
sourceSets {
main {
manifest.srcFile 'AndroidManifest.xml'
java.srcDirs = ['src']
res.srcDirs = ['res']
assets.srcDirs = ['assets']
}
androidTest {
setRoot('tests')
}
}
Paket org.junit existiert nicht
Sie haben vergessen, die Junit-Testabhängigkeit im App-Build-Skript hinzuzufügen
dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
androidTestCompile 'org.robolectric:robolectric:2.3'
androidTestCompile 'junit:junit:4.10'
}
java.lang.RuntimeException: Stub!
Sie führen diesen Test mit den Ausführungskonfigurationen von Android Studio anstelle der Befehlszeile aus (Registerkarte Terminal in Android Studio). Um es von Android Studio aus auszuführen, müssen Sie die app.iml
Datei aktualisieren , damit der JDK-Eintrag unten aufgeführt wird. Siehe Deckard-Gradle-Beispiel für Details.
Vollständiges Fehlerbeispiel:
!!! JUnit version 3.8 or later expected:
java.lang.RuntimeException: Stub!
at junit.runner.BaseTestRunner.<init>(BaseTestRunner.java:5)
at junit.textui.TestRunner.<init>(TestRunner.java:54)
at junit.textui.TestRunner.<init>(TestRunner.java:48)
at junit.textui.TestRunner.<init>(TestRunner.java:41)
at com.intellij.rt.execution.junit.JUnitStarter.junitVersionChecks(JUnitStarter.java:190)
at com.intellij.rt.execution.junit.JUnitStarter.canWorkWithJUnitVersion(JUnitStarter.java:173)
at com.intellij.rt.execution.junit.JUnitStarter.main(JUnitStarter.java:56)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:606)
at com.intellij.rt.execution.application.AppMain.main(AppMain.java:134)
FEHLER: JAVA_HOME wird auf ein ungültiges Verzeichnis gesetzt
In dieser SO-Frage finden Sie eine Lösung. Fügen Sie den folgenden Export zu Ihrem Bash-Profil hinzu:
export JAVA_HOME=`/usr/libexec/java_home -v 1.7`
Das vollständige Fehlerprotokoll:
ERROR: JAVA_HOME is set to an invalid directory: export JAVA_HOME=/Library/Java/JavaVirtualMachines/jdk1.7.0_51.jdk/Contents/Home
Please set the JAVA_HOME variable in your environment to match the
location of your Java installation.
Testklasse nicht gefunden
Wenn Sie Ihre Tests stattdessen mit Android Studio Junit Test Runner ausführen möchten, müssen Sie die Datei build.gradle etwas erweitern, damit Android Studio Ihre kompilierten Testklassen finden kann:
sourceSets {
testLocal {
java.srcDir file('src/test/java')
resources.srcDir file('src/test/resources')
}
}
android {
sourceSets {
instrumentTest.setRoot('src/test')
}
}
dependencies {
testLocalCompile 'junit:junit:4.11'
testLocalCompile 'com.google.android:android:4.1.1.4'
testLocalCompile 'org.robolectric:robolectric:2.3'
androidTestCompile 'junit:junit:4.11'
androidTestCompile 'com.google.android:android:4.1.1.4'
androidTestCompile 'org.robolectric:robolectric:2.3'
}
task localTest(type: Test, dependsOn: assemble) {
testClassesDir = sourceSets.testLocal.output.classesDir
android.sourceSets.main.java.srcDirs.each { dir ->
def buildDir = dir.getAbsolutePath().split('/')
buildDir = (buildDir[0..(buildDir.length - 4)] + ['build', 'classes', 'debug']).join('/')
sourceSets.testLocal.compileClasspath += files(buildDir)
sourceSets.testLocal.runtimeClasspath += files(buildDir)
}
classpath = sourceSets.testLocal.runtimeClasspath
}
check.dependsOn localTest
von: http://kostyay.name/android-studio-robolectric-gradle-getting-work/
Noch mehr Ressourcen
Die besten Artikel, die ich dazu gefunden habe, sind:
java.srcDirs = ['src/main/java','src/instrumentTest/java']
sourceSets
build.gradle