为啥 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)
注释你的测试类。
另见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 不工作?的主要内容,如果未能解决你的问题,请参考以下文章
为啥在 Android 4.0 上的 INSERT 和 UPDATE 速度较慢?