如何运行依赖于 Android 库模块的单元测试?

2023-12-01

每当我尝试对应用程序模块中依赖于库模块中的类的类运行单元测试时,我都会得到以下信息:

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

在上面的示例中,DummyData是的一部分lib模块,同时DummyModel是的一部分app模块。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
                         ...
                 ...

The build.gradle为了app模块包含以下内容:

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;
    }
}

The DummyModel class:

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);
    }
}

在尝试了十多种不同的方法之后,我们非常感谢任何帮助。


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

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

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何运行依赖于 Android 库模块的单元测试? 的相关文章

随机推荐

  • iTextSharp PDF 使用 C# 读取突出显示的文本(突出显示注释)

    我正在开发一个 C winform 应用程序 将 pdf 内容转换为文本 除 pdf 突出显示文本中的内容外 所有必需的内容均被提取 请帮助获取工作示例以提取 pdf 中突出显示的文本 我在项目中使用 iTextSharp dll 假设您正
  • .htaccess URL 屏蔽而不是重定向 [关闭]

    Closed 这个问题是无关 目前不接受答案 我试图掩盖 URL 就像真实的 URL 一样www somedomain com subfolder index php p page3表明www somedomain com subfolde
  • 有什么方法可以解码字符串吗? [复制]

    这个问题在这里已经有答案了 可能的重复 如何解码字符串 Java 如何像 HttpUtility HtmlDecode 一样解码 Java 中的 HTML 字符实体 Hi 我有像例如这样的字符串 s 需要像这样转换 s 请帮我这里 提前致谢
  • Laravel 4:一个模型可以服务多个数据库表吗?

    在我的应用程序中 我有几个 mysql 表 多伦多 温哥华 蒙特利尔等 并且我使用 DB 类来处理它们 例如 data DB select select from toronto where id array id 我想做的是开始使用 El
  • 将 CSS 过渡/动画减慢为“慢动作”

    On a Mac if you hold the Shift key and perform an action that involves animation it will slow down the animation For exa
  • 全局命名空间会被污染是什么意思?

    全局命名空间会被污染是什么意思 我真的不明白全局命名空间被污染意味着什么 关于垃圾收集的快速说明 当变量失去作用域时 它们将有资格进行垃圾回收 如果它们的作用域是全局的 那么在全局命名空间失去作用域之前 它们将不符合收集条件 这是一个例子
  • GitHub 推/拉错误

    我对 GitHub 有点陌生 我刚刚创建了我的帐户并进行了设置等 我非常仔细地按照以下步骤操作http help github com create a repo 但是当我执行最后一个命令 git push u origin master
  • 如何在Firestore中保存时间戳?

    我正在开发一个聊天应用程序 我想存储我的消息的时间戳 我的消息数据类是 import com google firebase firestore ServerTimestamp import java util Date public cl
  • Python 中的链式比较数字范围

    我有以下功能 def InRange number return 5 lt number gt 1 如果使用链式比较该数字不在 1 到 5 的范围内 我希望此值为 false 但似乎无法正确执行此操作 有什么建议么 你想要这样的 def I
  • 如何将文件从 JavaScript 传递到 PHP? [复制]

    这个问题在这里已经有答案了 是否可以将文件从 JavaScript 传递到 PHP 最好使用ajax 如果我们有以下代码
  • 无法登录 mssql-server-linux 容器中的 SQL Server

    我不情愿地执行尝试在 docker 容器中使用 Microsoft SQL Server 的耗费灵魂的任务 并且正在使用 Microsoft 提供的 mssql server linux 盒子 但无论我做什么我都无法登录 这是我的 dock
  • 可安装的触发器以不同的形式触发脚本?

    当提交不同的表单 B 时 我尝试运行连接到一个表单 A 的脚本 我有一系列相似的不同形式 需要运行相同的脚本 因此我不知道这是否可能 而不是将代码复制到每个脚本 我成功地在 A 中制作了一个可安装的触发器函数 指向 B 当出现提示时 我已授
  • 作业 - 无法利用缓冲区溢出

    我正在尝试学习在 Backtrack Linux 上利用简单的缓冲流技术 这是我的 C 程序 include
  • python-pptx:将图片插入内容占位符

    我正在使用 python pptx 0 6 0 并创建了一张包含内容和标题的幻灯片 我想将图片插入到内容占位符中 但没有诸如 add picture 或 insert picuture 之类的属性可供使用 如何将图片添加到此内容占位符中 谢
  • 使用 XSL 将所有元素名称转换为小写?

    在 XSL 中 如何在处理文档之前将文档中的所有元素名称转换为小写 我们正在使用 XSLT 2 0 并且我们已经尝试了以下方法 但它不起作用 a a
  • 向网格添加空行

    我正在尝试将行添加到我的网格中 我在文档中看到了一个例子 onAddRouteClick function Create a model instance var rec new KitchenSink model grid Plant b
  • 每次注销后 RVM 设置都会丢失

    我按照以下说明在 ubuntu 上使用 RVM 安装了 ruby rails 和 gemset http railstutorial org ruby on rails tutorial book sec rubygems 现在的问题是 每
  • 如何在android中用标记显示地图

    我正在开发 Android 应用程序 而且我在这方面完全是新手 所以我想知道如何在地图中显示标记以及如何在特定时间更改他的位置 例如定义线程或背景中的任何内容 这些内容将发送纬度和经度值并且标记在该位置上移动 如果您只想展示单个项目 Map
  • GCP Dataflow 2.0 PubSub 到 GCS

    我很难理解 TextIO write 的 withFileNamePolicy 的概念 对于像指定 GCS 存储桶来写入流式文件这样简单的事情来说 提供 FileNamePolicy 的要求似乎非常复杂 在较高级别上 我将 JSON 消息传
  • 如何运行依赖于 Android 库模块的单元测试?

    每当我尝试对应用程序模块中依赖于库模块中的类的类运行单元测试时 我都会得到以下信息 java lang NoClassDefFoundError de ivu junittest DummyData at de ivu junittest