Unit testing 如何运行依赖于Android库模块的单元测试?
每当我尝试对我的应用程序模块中依赖于库模块中的类的类运行单元测试时,我都会得到以下结果:Unit testing 如何运行依赖于Android库模块的单元测试?,unit-testing,gradle,android-studio,android-library,robolectric,Unit Testing,Gradle,Android Studio,Android Library,Robolectric,每当我尝试对我的应用程序模块中依赖于库模块中的类的类运行单元测试时,我都会得到以下结果: java.lang.NoClassDefFoundError: de/ivu/junittest/DummyData at de.ivu.junittest.app.DummyModel.<init>(DummyModel.java:16) at DummyModelTest.testInstantiation(DummyModelTest.java:7) ... ap
java.lang.NoClassDefFoundError: de/ivu/junittest/DummyData
at de.ivu.junittest.app.DummyModel.<init>(DummyModel.java:16)
at DummyModelTest.testInstantiation(DummyModelTest.java:7)
...
app
模块的build.gradle
包含以下内容:
apply plugin: 'android'
android {
compileSdkVersion 19
buildToolsVersion "19.0.1"
defaultConfig {
minSdkVersion 7
targetSdkVersion 19
versionCode 1
versionName "1.0"
}
buildTypes {
release {
runProguard false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.txt'
}
}
}
sourceSets {
unitTest {
java.srcDir file('src/test/java')
resources.srcDir file('src/test/res')
}
}
configurations {
unitTestCompile.extendsFrom runtime
unitTestRuntime.extendsFrom unitTestCompile
}
dependencies {
compile 'com.android.support:appcompat-v7:+'
compile project (':lib')
compile fileTree(dir: 'libs', include: ['*.jar', '*.aar'])
unitTestCompile files("$project.buildDir/classes/release")
unitTestCompile 'junit:junit:4.+'
unitTestCompile 'org.robolectric:robolectric:2.+'
unitTestCompile 'com.google.android:android:4.+'
unitTestCompile project (':lib')
unitTestCompile fileTree(dir: 'libs', include: ['*.jar', '*.aar'])
instrumentTestCompile 'junit:junit:4.+'
instrumentTestCompile 'org.robolectric:robolectric:2.+'
}
task unitTest(type:Test, dependsOn: assemble) {
testClassesDir = project.sourceSets.unitTest.output.classesDir
classpath = project.sourceSets.unitTest.runtimeClasspath
}
check.dependsOn unitTest
最后是三个java类的源代码,从DummyData
开始:
package de.ivu.junittest;
import android.util.Log;
public class DummyData {
private int data;
public int getData() {
return data;
}
public void setData(int data) {
this.data = data;
}
}
DummyModel
类:
package de.ivu.junittest.app;
import android.util.Log;
import de.ivu.junittest.DummyData;
public class DummyModel {
private DummyData data = new DummyData();
public void setData(int data) {
this.data.setData(data);
}
public int getData() {
return this.data.getData();
}
}
最后,DummyModelTest
:
import static org.junit.Assert.assertEquals;
import org.junit.runner.RunWith;
import org.junit.Test;
import org.robolectric.RobolectricTestRunner;
import de.ivu.junittest.app.DummyModel;
@RunWith(RobolectricTestRunner.class)
public class DummyModelTest {
@Test
public void testInstantiation() {
DummyModel model = new DummyModel();
model.setData(42);
assertEquals(model.getData(), 42);
}
}
在尝试了十几种不同的方法之后,我们非常感谢您的帮助。诀窍是将其他模块的
类
目录添加为依赖项。因此,您最终使用的是unitTestCompile文件
,而不是unitTestCompile项目
:
dependencies {
...
unitTestCompile files("../lib/classes/release")
...
}
不是很漂亮,也不是很直观,但它可以与我当前的设置(Gradle 1.10、Build Tools 19.0.1和Android Gradle plugin 0.8)配合使用。如果您的库位于.aar文件中,该怎么办。你试过了吗?我没有完全尝试.aar文件,而是尝试在库中使用JAR。我也没有工作,项目中的构建脚本变得更加糟糕。
dependencies {
...
unitTestCompile files("../lib/classes/release")
...
}