소개
현재 robolectric 2.4는 최신 버전이며 appcompat v7
라이브러리를 지원하지 않습니다 . robolectric 3.0 릴리스에 지원이 추가 될 예정입니다 ( 아직 ETA 없음 ). 또한 ActionBar Sherlock
robolectric에 문제를 일으킬 수 있습니다.
Android Studio에서 Robolectric을 사용하려면 두 가지 옵션이 있습니다.
(옵션 1)-Java 모듈을 사용하여 Android Studio에서 JUnit 테스트 실행
이 기술은 Android 모듈에 대한 종속성이있는 모든 테스트에 Java 모듈을 사용하고 몇 가지 마법이있는 사용자 지정 테스트 실행기를 사용합니다.
지침은 다음에서 찾을 수 있습니다. http://blog.blundellapps.com/how-to-run-robolectric-junit-tests-in-android-studio/
또한 Android 스튜디오에서 테스트를 실행하려면 해당 게시물 끝에있는 링크를 확인하십시오.
(옵션 2)-robolectric-gradle-plugin을 사용하여 Android Studio에서 JUnit 테스트 실행
Android Studio의 gradle에서 실행할 junit 테스트를 설정하는 데 몇 가지 문제가 발생했습니다.
이것은 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
빌드 스크립트 (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
그리고, (다시 또는 업데이트 설정) 테스트로 끝나는 확장하여 테스트 클래스의 이름 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:
:app:test
BUILD SUCCESSFUL
문제 해결
대체 소스 디렉토리
Java 소스 파일을 다른 곳에 둘 수있는 것처럼 테스트 소스 파일을 이동할 수 있습니다. gradle sourceSets
구성을 업데이트하십시오 .
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 스튜디오의 터미널 탭) 대신 Android 스튜디오에서 실행 구성으로이 테스트를 실행하고 있습니다. 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 Test Runner에서 테스트를 실행하려면 Android 스튜디오가 컴파일 된 테스트 클래스를 찾을 수 있도록 build.gradle 파일을 조금 더 확장해야합니다.
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