33

正如 Android 的文档所说,“请注意,Android 测试 API 支持 JUnit 3 代码风格,但不支持 JUnit 4。” (测试基础)。应该清楚的是,JUnit 4 不能开箱即用地与 Android 一起使用。

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

4

2 回答 2

40

2015/10 更新

现在可以通过 AndroidJUnitRunner 实现,它是Android 测试支持库的一部分。简而言之,在一个基于 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 设置说明。请注意,对于普通的 JUnit4 测试,您不需要 Espresso 本身。

为什么需要它

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

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

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

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

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

于 2012-08-11T18:00:00.080 回答
2

解释(日文)在这里:

http://d.hatena.ne.jp/esmasui/20120910/1347299594

我认为问题出在InstrumentationTestRunner.

作者的解决方案是AndroidJUnit4项目。

于 2012-11-28T18:50:08.333 回答