【问题标题】:How to run unit tests with dependency to an Android library module?如何运行依赖于 Android 库模块的单元测试?
【发布时间】:2014-02-10 09:32:43
【问题描述】:

每当我尝试为我的应用模块中依赖于库模块中的类的类运行单元测试时,我都会得到:

java.lang.NoClassDefFoundError: de/ivu/junittest/DummyData
    at de.ivu.junittest.app.DummyModel.<init>(DummyModel.java:16)
    at DummyModelTest.testInstantiation(DummyModelTest.java:7)
    ...

在上面的示例中,DummyDatalib 模块的一部分,而DummyModelapp 模块的一部分。 DummyModel 有一个 DummyData 类型的成员,但在测试类 DummyModelTest 中实例化它会导致在测试时出现上述异常。

项目结构如下:

JUnitTestProject
    app [module]
         src
             main
                 java
                     de.ivu.junittest.app
                         DummyModel.java
                         ...
                 ...
             test
                 java
                     de.ivu.junittest.app
                         DummyModelTest.java
                 ...
    lib [module]
         src
             main
                 java
                     de.ivu.junittest
                         DummyData.java
                         ...
                 ...

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-classes的来源,以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);
    }
}

在尝试了十几种不同的事情之后,任何帮助都深表感谢。

【问题讨论】:

    标签: unit-testing gradle android-studio android-library robolectric


    【解决方案1】:

    诀窍是添加其他模块的classes 目录作为依赖项。所以你最终会得到unitTestCompile files 而不是unitTestCompile project

    dependencies {
        ...
        unitTestCompile files("../lib/classes/release")
        ...
    }
    

    不是很漂亮,也不是很直观,但它适用于我当前的设置(Gradle 1.10、Build Tools 19.0.1 和 Android-Gradle-plugin 0.8)。

    【讨论】:

    • 如果您的库位于 .aar 文件中怎么办。你试过吗?
    • 我并没有完全尝试使用 .aar 文件,而是尝试将 JAR 用于库。我也没有工作,项目中的构建脚本变得更加糟糕。
    • 我无法让它工作。在您的成绩构建文件中引用时,根文件夹是什么?我觉得我可能需要一些额外的../
    • 抱歉,请不要再在我发现这个问题的公司工作,所以我无法访问源代码,无法回答您的问题。但是,我真诚地希望,Android 的单元测试在过去 8 年里已经取得了长足的进步。因此我的回答可能已经过时了。
    猜你喜欢
    • 2020-11-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-01
    • 2016-06-22
    • 1970-01-01
    • 2017-09-25
    相关资源
    最近更新 更多