【问题标题】:Best way to run fast JUnit tests in Android project in Android Studio在 Android Studio 的 Android 项目中运行快速 JUnit 测试的最佳方式
【发布时间】:2014-08-30 23:28:32
【问题描述】:

我的 Android Studio 项目中有一些普通的旧 Java 类和简单的 JUnit 测试。他们目前住在我的 Android 模块中。如果我将它们作为 Android 测试运行,它们可以通过,但它们真的很慢,因为它需要启动或连接到模拟器。

如果我尝试运行一个 JUnit 测试,我遇到了!!! JUnit version 3.8 or later expected JUnit 版本问题。这个answer 解释了如何解决这个问题。不幸的是,然后我点击了java.lang.NoClassDefFoundError: junit/textui/ResultPrinter,我不知道如何解决。

然后我尝试将我的 JUnit 测试移动到依赖于 Android 模块的单独 Java 模块中。一切都编译得很好。我添加了一个新配置来启动 JUnit 测试 (:MyJUnitTests:test),但测试失败并显示 package com.myproject.util does not exist。看起来类路径可能不包括依赖 Android 模块中的类。

有人知道如何解决这个类路径问题吗?我查看了很多相关的答案,但似乎没有一个对我有用。还是尝试将我的 JUnit 测试保留在他们自己的模块中只是一个坏主意?

如果我将普通 Java 类及其 JUnit 测试移动到一个完全独立的模块中(例如 here),我可以让 JUnit 测试快速运行并通过,并反转依赖关系,以便 Android 模块依赖于 Java 模块.这是首选的解决方案吗?

【问题讨论】:

    标签: android unit-testing junit gradle android-studio


    【解决方案1】:

    基本问题是 Android 框架类在 Android 操作系统环境之外无法正常工作,因此任何依赖于框架类的代码都无法在常规 JUnit 环境中运行,正如您所发现的那样。

    您尝试将 JUnit 测试移至单独模块的解决方案将不起作用,因为您不能让纯 Java 模块依赖于 Android 模块。 Android Gradle 模块不像 Java 模块,因为 Android 构建要复杂得多,而且 Android 模块构建的最终结果将是 APK 或 AAR,而其他模块类型无法理解。

    如果您可以将纯 Java 类和单元测试移动到纯 Java 模块中并让 Android 模块依赖它,那么这将是获得 IDE 中官方功能最多支持的最佳方法。它还将具有架构优势,因为它将使这些类不受 Android 抽象的影响,使其更具可移植性,并强制将业务逻辑与 UI 或存储或其他更特定于设备的事物分离。

    如果这对您来说很难做到,那么很多与您一样的开发人员会选择Robolectric,这是一个测试工具,允许依赖于 Android 框架的许多部分的代码在没有模拟器的 JUnit 环境中运行,或者设备。它没有得到谷歌官方的支持,但谷歌知道它被广泛使用并努力不肆意破坏它。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-10-18
      • 1970-01-01
      • 2017-06-29
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多