java - 为什么 Android 上的 JUnit 4 不工作?

标签 java android junit4 dalvik junit3

正如 Android 的文档所说,“请注意,Android 测试 API 支持 JUnit 3 代码风格,但不支持 JUnit 4。” (Testing Fundamentals)。应该清楚的是,JUnit 4 不能在 Android 中开箱即用。

但是为什么会这样呢?是因为测试是在 DVM 中执行的(因为 Android 运行时只支持 JUnit 3)?在 JVM 上,它自己可以选择应该使用的 JUnit 运行时。这在 DVM 中是不可能的吗?

最佳答案

2015/10 更新

现在可以通过Android Testing Support Library 中的AndroidJUnitRunner 来实现。 .简而言之,在基于 Gradle 的项目中需要做到以下几点:

  1. 添加依赖:

    dependencies {
        compile 'com.android.support:support-annotations:22.2.0'
        androidTestCompile 'com.android.support.test:runner:0.4.1'
    }
    
  2. 指定 testInstrumentationRunner:

    android {
        defaultConfig {
            testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
        }
    }
    
  3. 使用 @RunWith(AndroidJUnit4.class) 注释您的测试类。

  4. 以正常的 JUnit4 风格编写测试。

另见 Espresso setup instructions .请注意,普通的 JUnit4 测试不需要 Espresso 本身。

为什么需要它

我在互联网上能找到的关于这个主题的信息非常少。我找到的最好的是 InstrumentationTestRunner 上的信息.

没有什么可以阻止 JUnit4 测试像任何其他 Java 代码一样在 Android 设备上运行。然而,Android 测试框架做了一些额外的工作:

  1. 它通过 ADB 将测试结果发送回您的开发机器。
  2. 它进行检测(我不确定这具体涉及什么)。

以上是由一些专门针对 JUnit3 的扩展执行的。

这段特定于 JUnit3 的代码似乎是 InstrumentationTestRunner 的一部分,它构成了核心 Android 系统的一部分。但是,从 AndroidJUnitRunner 可以看出,可以使用支持 JUnit4 或其他框架的自定义测试运行器。

关于java - 为什么 Android 上的 JUnit 4 不工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9809180/

相关文章:

java - 更新记录后如何获取最后一个ID?

java - java 中宏替换的替代方案

java - 从(子)目录中的文件读取文本

java - Resources$NotFoundException 调用 Robolectric.buildActivity() 时

java - 配置问题 : spring-security-web classes are not available. 你需要这些才能使用 <filter-chain-map>

java - 可以使用 GCJ 生成可从 Python 调用的库吗?

java - 改造响应正文为空但状态代码为 200

android - 如何将动态创建的单选按钮设置为单选组?

java - 使用 libgdx 的输入文本字段发送特殊字符

unit-testing - 如何在 grails 中使用 junit 模拟接口(interface)