如何在Android Studio 1.0中设置Robolectric
我是一名Android开发者,也是一名TDD爱好者。最近,我了解到一个新的测试框架Robolectric,它似乎远远优于Android Studio默认提供的JUnit3解决方案。我想设置它,但经过多次尝试,失败了,如何在Android Studio 1.0中设置Robolectric,android,tdd,junit4,robolectric,Android,Tdd,Junit4,Robolectric,我是一名Android开发者,也是一名TDD爱好者。最近,我了解到一个新的测试框架Robolectric,它似乎远远优于Android Studio默认提供的JUnit3解决方案。我想设置它,但经过多次尝试,失败了,java.lang.RuntimeException:Stub我一无所获 我的问题是: 如何在Andoird Studio 1.0上逐步设置机器人分子测试框架?请注意: 我不需要模糊的想法或暗示。我需要一个完整的解决方案 我不能提供任何代码从我以前的尝试,因为它是无用的,已经删除
java.lang.RuntimeException:Stub代码>我一无所获
我的问题是:
如何在Andoird Studio 1.0上逐步设置机器人分子测试框架?请注意:
- 我不需要模糊的想法或暗示。我需要一个完整的解决方案
- 我不能提供任何代码从我以前的尝试,因为它是无用的,已经删除
这个框架的设置非常有问题,在不同版本的Android Studio和IntelliJ中存在许多问题。我浏览了所有这些,但都没有用。我需要在Android Studio 1.0上成功使用该框架的人的帮助。编辑:
在这几个月里,Android Studio的Robolectric安装过程有了很大的改进,所以在尝试下面的“长”方法之前,请尝试一下官方指南!:-)
好的,我成功设置了它!这是非常棘手的,不完全兼容最新的Gradle1.0.0,但它的工作就像一个魅力
我的解决方案主要基于
因此,build.gradle文件(项目文件夹中的“内部”文件)应如下所示:
buildscript {
repositories {
mavenCentral()
}
dependencies {
classpath 'com.android.tools.build:gradle:0.14.1'
classpath 'org.robolectric:robolectric-gradle-plugin:0.14.0'
}
}
allprojects {
repositories {
mavenCentral()
maven { url 'https://oss.sonatype.org/content/repositories/snapshots' }
}
}
apply plugin: 'com.android.application'
apply plugin: 'robolectric'
android {
compileSdkVersion 21
buildToolsVersion "21.1.1"
defaultConfig {
applicationId '[your app id]'
minSdkVersion 9
targetSdkVersion 21
versionCode 1
versionName "1.0"
}
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_7
targetCompatibility JavaVersion.VERSION_1_7
}
sourceSets {
androidTest.setRoot('src/androidTest') // This one is important, make sure to avoid typos in it, or you will get empty tests
}
lintOptions {
abortOnError false
disable 'InvalidPackage'
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
productFlavors {
}
}
dependencies {
compile fileTree(include: ['*.jar'], dir: 'libs')
compile 'com.android.support:appcompat-v7:21.0.2'
// ================== TESTING LIBRARIES ======================
androidTestCompile 'junit:junit:4.10'
androidTestCompile 'org.robolectric:robolectric:2.4'
androidTestCompile 'org.bouncycastle:bcprov-jdk15on:1.50'
}
robolectric {
// configure the set of classes for JUnit tests
include '**/*Test.class' //Make sure you call all your test classes according to this expression!!!
// configure max heap size of the test JVM
maxHeapSize = "2048m"
}
apply plugin: 'jacoco'
jacoco {
toolVersion = "0.7.1.201405082137"
}
def coverageSourceDirs = [
'../app/src/main/java'
]
task jacocoTestReport(type: JacocoReport, dependsOn: "testDebug") {
group = "Reporting"
description = "Generate Jacoco coverage reports"
classDirectories = fileTree(
dir: '../app/build/intermediates/classes/debug',
excludes: ['**/R.class',
'**/R$*.class',
'**/*$ViewInjector*.*',
'**/BuildConfig.*',
'**/Manifest*.*']
)
additionalSourceDirs = files(coverageSourceDirs)
sourceDirectories = files(coverageSourceDirs)
executionData = files('../app/build/jacoco/testDebug.exec')
reports {
xml.enabled = true
html.enabled = true
}
}
import android.app.Activity;
import junit.framework.Assert;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.robolectric.Robolectric;
import org.robolectric.RobolectricTestRunner;
import org.robolectric.annotation.Config;
@Config(emulateSdk = 18, reportSdk = 18) //Those are required as the framework does not yet support higher API levels
@RunWith(RobolectricTestRunner.class)
public class RoboDummyTest {
@Test
public void testActivityFound() {
Activity activity = Robolectric.buildActivity(MainActivity.class).create().get();
Assert.assertNotNull(activity);
}
}
它看起来很像“outer”build.gradle文件,但所有这些东西都必须在这里
这里可能不需要我的一些元素,但我尽了最大努力将其缩减到核心部分。完成此操作后,将创建一个测试类,如下所示:
buildscript {
repositories {
mavenCentral()
}
dependencies {
classpath 'com.android.tools.build:gradle:0.14.1'
classpath 'org.robolectric:robolectric-gradle-plugin:0.14.0'
}
}
allprojects {
repositories {
mavenCentral()
maven { url 'https://oss.sonatype.org/content/repositories/snapshots' }
}
}
apply plugin: 'com.android.application'
apply plugin: 'robolectric'
android {
compileSdkVersion 21
buildToolsVersion "21.1.1"
defaultConfig {
applicationId '[your app id]'
minSdkVersion 9
targetSdkVersion 21
versionCode 1
versionName "1.0"
}
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_7
targetCompatibility JavaVersion.VERSION_1_7
}
sourceSets {
androidTest.setRoot('src/androidTest') // This one is important, make sure to avoid typos in it, or you will get empty tests
}
lintOptions {
abortOnError false
disable 'InvalidPackage'
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
productFlavors {
}
}
dependencies {
compile fileTree(include: ['*.jar'], dir: 'libs')
compile 'com.android.support:appcompat-v7:21.0.2'
// ================== TESTING LIBRARIES ======================
androidTestCompile 'junit:junit:4.10'
androidTestCompile 'org.robolectric:robolectric:2.4'
androidTestCompile 'org.bouncycastle:bcprov-jdk15on:1.50'
}
robolectric {
// configure the set of classes for JUnit tests
include '**/*Test.class' //Make sure you call all your test classes according to this expression!!!
// configure max heap size of the test JVM
maxHeapSize = "2048m"
}
apply plugin: 'jacoco'
jacoco {
toolVersion = "0.7.1.201405082137"
}
def coverageSourceDirs = [
'../app/src/main/java'
]
task jacocoTestReport(type: JacocoReport, dependsOn: "testDebug") {
group = "Reporting"
description = "Generate Jacoco coverage reports"
classDirectories = fileTree(
dir: '../app/build/intermediates/classes/debug',
excludes: ['**/R.class',
'**/R$*.class',
'**/*$ViewInjector*.*',
'**/BuildConfig.*',
'**/Manifest*.*']
)
additionalSourceDirs = files(coverageSourceDirs)
sourceDirectories = files(coverageSourceDirs)
executionData = files('../app/build/jacoco/testDebug.exec')
reports {
xml.enabled = true
html.enabled = true
}
}
import android.app.Activity;
import junit.framework.Assert;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.robolectric.Robolectric;
import org.robolectric.RobolectricTestRunner;
import org.robolectric.annotation.Config;
@Config(emulateSdk = 18, reportSdk = 18) //Those are required as the framework does not yet support higher API levels
@RunWith(RobolectricTestRunner.class)
public class RoboDummyTest {
@Test
public void testActivityFound() {
Activity activity = Robolectric.buildActivity(MainActivity.class).create().get();
Assert.assertNotNull(activity);
}
}
所有数据都是存根,当然:-)
最后,通过在Android Studio内的终端中键入gradlew test
来运行测试。结果将保存到项目的build
目录中的html文件中
我希望这将有助于任何计划使用Android Studio 1.0设置Robolectric的人。祝你快乐
编辑:
我用来写答案的博客文章的作者Kvandermast好心地提供了以下链接,链接到一个存储库,其中包含一个工作示例,每个Android Studio更新都会更新:
我已经尝试了我能找到的所有不同的解决方法,有些可行,有些根本不可行
但是昨天我发现了一个不用花太多力气就能工作的,而且做得非常好:
这种方法基于另一个gradle robolectric插件,但它还包括一个android studio插件,该插件以一种简洁的方式处理类路径问题
这是我找到的最好的解决方案!它的工作原理几乎就像开箱一样。当你在你最喜欢的搜索引擎上搜索“android studio”时,你学到了什么?我学习了大约10种不同的解决方法和设置方法,但没有一种有效。它包括编辑Gradle脚本、编辑项目的iml文件以及干预项目中编译的顺序库。这些都不起作用。我正在寻找已经让Robolectric作为1.0运行的人。在尝试使用此设置运行/gradlew clean build
时,我仍然会在每个测试类上出现ClassNotFoundException
错误。我的设置与您发布的教程中描述的相同,目录结构为src/main和src/androidTest。知道是什么吗?找不到什么类?所有的测试类都找不到。。。非常确定这是因为它们甚至不是出于某种原因而构建的。这两行代码:包括'***Test.class'
androidTest.setRoot('src/androidTest')
确保它们是正确的是的,肯定有,但仍然不起作用:(