为啥 Android 上的 JUnit 4 不工作?

Posted

技术标签:

【中文标题】为啥 Android 上的 JUnit 4 不工作?【英文标题】:Why is JUnit 4 on Android not working?为什么 Android 上的 JUnit 4 不工作? 【发布时间】:2012-04-06 05:47:06 【问题描述】:

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

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

【问题讨论】:

你见过这个问题吗?也许这就是你要找的东西:***.com/questions/2172152/… 谢谢,但实际上我不是在寻找这个解决方案。当然,使用此解决方案可以使用 JUnit 4 测试 POJO。但不可能将它用于依赖于 Android 框架类的代码单元(即在设备本身上运行,而不是在我的开发机器上的 JVM 上运行)我'我很确定几乎不可能在 DVM 中运行 JUnit 4 测试,但我正在寻找解释为什么会这样。 我不知道为什么会这样,除了 Android 单元测试实现扩展了 JUnit3 库。我确信未来版本的 android 开发工具包将支持 4。 【参考方案1】:

2015/10 更新

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

    添加依赖:

    dependencies 
        compile 'com.android.support:support-annotations:22.2.0'
        androidTestCompile 'com.android.support.test:runner:0.4.1'
    
    

    指定 testInstrumentationRunner:

    android 
        defaultConfig 
            testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
        
    
    

    @RunWith(AndroidJUnit4.class)注释你的测试类。

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

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

为什么需要它

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

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

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

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

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

【讨论】:

是否可以在 Android.mk 文件中添加“androidTestCompile”依赖?如果是的话,你能告诉我怎么做吗?【参考方案2】:

解释(日文)在这里:

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

我认为问题出在InstrumentationTestRunner 的实现上。

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

【讨论】:

以上是关于为啥 Android 上的 JUnit 4 不工作?的主要内容,如果未能解决你的问题,请参考以下文章

为啥testng依赖junit?

为啥在 Android 4.0 上的 INSERT 和 UPDATE 速度较慢?

为啥 JUnit 测试异常总是失败? [复制]

Android JUnit Test——批量运行测试代码

为啥 JUnit 不提供 assertNotEquals 方法?

依赖冲突android工作室