介绍
请注意,在撰写本文时,robolectric 2.4是最新版本,并且不支持appcompat v7
库。支持将在robolectric 3.0版本中添加(尚无ETA)。也ActionBar Sherlock
可能引起robolectric问题。
要在Android Studio中使用Robolectric,您有两种选择:
(选项1)-使用Java模块在Android Studio中运行JUnit测试
该技术将Java模块用于所有测试,并依赖于android模块,并使用一些魔术来定制测试运行器:
可以在这里找到说明:http : //blog.blundellapps.com/how-to-run-robolectric-junit-tests-in-android-studio/
另外,请检查该博文末尾的链接,以从android studio运行测试。
(选项2)-使用robolectric-gradle-plugin在Android Studio中运行JUnit测试
我在设置junit测试以从Android Studio的gradle中运行时遇到了一些问题。
这是一个非常基本的示例项目,用于在Android Studio中从基于gradle的项目中运行junit测试:https : //github.com/hanscappelle/android-studio-junit-robolectric这已在Android Studio 0.8.14,JUnit 4.10, robolectric gradle插件0.13+和robolectric 2.3
Buildscript(project / build.gradle)
构建脚本是项目根目录中的build.gradle文件。在那里我不得不将robolectric gradle插件添加到classpath
buildscript {
repositories {
jcenter()
}
dependencies {
classpath 'com.android.tools.build:gradle:0.13.2'
classpath 'org.robolectric:robolectric-gradle-plugin:0.13.+'
}
}
allprojects {
repositories {
jcenter()
}
}
项目构建脚本(App / build.gradle)
在您的应用模块的构建脚本中,使用robolectric
插件,添加robolectric
配置并添加androidTestCompile
依赖项。
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'
}
创建JUnit测试类
现在将测试类放在默认位置(或更新gradle配置)
app/src/androidTest/java
并命名测试类以Test结尾(或再次更新config),junit.framework.TestCase
并使用扩展和注释测试方法@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;
}
}
执行测试
接下来,在命令行中使用gradlew执行测试(chmod +x
如果需要,使其可执行)
./gradlew clean test
样本输出:
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
故障排除
备用源目录
就像您可以将Java源文件放在其他位置一样,您可以移动测试源文件。只需更新gradlesourceSets
配置。
sourceSets {
main {
manifest.srcFile 'AndroidManifest.xml'
java.srcDirs = ['src']
res.srcDirs = ['res']
assets.srcDirs = ['assets']
}
androidTest {
setRoot('tests')
}
}
软件包org.junit不存在
您忘记在应用程序构建脚本中添加junit测试依赖项
dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
androidTestCompile 'org.robolectric:robolectric:2.3'
androidTestCompile 'junit:junit:4.10'
}
java.lang.RuntimeException:存根!
您正在使用Android Studio的运行配置而不是命令行(Android Studio中的“终端”标签)运行此测试。要从Android Studio运行它,您必须更新app.iml
文件以在底部列出jdk条目。有关详细信息,请参见deckard-gradle示例。
完整的错误示例:
!!! 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)
错误:JAVA_HOME设置为无效目录
请参阅此SO问题以获取解决方案。将以下导出添加到您的bash配置文件中:
export JAVA_HOME=`/usr/libexec/java_home -v 1.7`
完整的错误日志:
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.
找不到测试班
如果您想从Android Studio Junit TestRunner运行测试,则必须再扩展build.gradle文件,以便android studio可以找到编译后的测试类:
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
来自:http : //kostyay.name/android-studio-robolectric-gradle-getting-work/
更多资源
我发现的最佳文章是:
java.srcDirs = ['src/main/java','src/instrumentTest/java']
在sourceSets
一节的build.gradle