为什么在Android上使用JUnit 4无法正常工作?

33
根据Android文档所述,“请注意,Android测试API支持JUnit 3代码风格,但不支持JUnit 4。” (测试基础)。这表明JUnit 4无法与Android直接兼容。
但是为什么会这样?这是因为测试在DVM内执行(Android Runtime仅支持JUnit 3)吗?在JVM上,可以选择要使用的JUnit运行时。在DVM中不可能吗?

1
你看过这个问题吗?也许这就是你要找的:https://dev59.com/KnI95IYBdhLWcg3wvwsQ - bsimic
1
谢谢,但实际上我不是在寻找这个解决方案。当然,使用这个解决方案可以使用JUnit 4测试POJOs。但是无法将其用于依赖于Android框架类的代码单元(即在设备本身上运行而不是在开发机器上的JVM上运行的代码单元)。我非常确定在DVM中几乎不可能运行JUnit 4测试,但我正在寻找一个解释为什么会出现这种情况。 - Matthew
我不知道为什么会这样,除了Android单元测试实现扩展了JUnit3库之外。我相信未来的Android开发套件版本将支持JUnit4。 - bsimic
2个回答

40

更新 2015/10

现在可以通过 AndroidJUnitRunner 实现,这是 Android 测试支持库 的一部分。简单来说,在基于 Gradle 的项目中,您需要执行以下操作:

  1. Add the dependencies:

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

    android {
        defaultConfig {
            testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
        }
    }
    
  3. Annotate your test class with @RunWith(AndroidJUnit4.class).

  4. Write your tests in normal JUnit4 style.

另请参阅Espresso设置说明。请注意,对于普通的JUnit4测试,您不需要Espresso本身。

为什么需要它

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

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

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

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

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


能否在Android.mk文件中添加“androidTestCompile”依赖项?如果可以,请告诉我如何做? - Ambi

2

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接