为什么Android上的JUnit 4无法正常工作?

2022-09-01 08:56:04

正如Android的文档所说,“请注意,Android测试API支持JUnit 3代码样式,但不支持JUnit 4。(测试基础知识)。应该清楚的是,JUnit 4不能与Android一起使用。

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


答案 1

更新 2015/10

现在可以通过AndroidJUnitRunner实现,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 样式编写测试。

另请参阅意式浓缩咖啡设置说明。请注意,在普通的 JUnit4 测试中,您不需要 Espresso 本身。

为什么需要它

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

没有什么能阻止JUnit4测试在Android设备上运行,就像任何其他Java代码一样。但是,Android 测试框架会执行一些额外的工作:

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

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

这个特定于JUnit3的代码似乎是InseculitionTestRunner的一部分,它是核心Android系统的一部分。但是,正如AndroidJUnitRunner所表明的那样,可以使用支持JUnit4或其他框架的自定义测试运行程序。


答案 2

解释(日语)在这里:

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

我认为这个问题来自 InstrumentationTestRunner 的实现。

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


推荐