为什么Android上的JUnit 4不起作用?

作为Android的文档说:“请注意,AndroidtestingAPI支持JUnit 3代码风格,但不支持JUnit 4.” ( testing基础 )。 应该清楚的是,JUnit 4不能与Android一起使用。

但是为什么这样呢? 是否因为testing在DVM中执行(因为Android运行时只支持JUnit 3)? 在JVM上,可以select应该使用的JUnit运行时。 在DVM中这不可能吗?

  • 调用Robolectric.buildActivity()时资源$ NotFoundException
  • 测试ClassNotFoundexception
  • testingClassNotFoundexception
  • Android:unit testing一个服务
  • 用gradle测试一个android项目的junit测试
  • Robolectric + Eclipse找不到资源?
  • 使用JUnit +的unit testing用例(Robolectric或Mockito或Android中的两者)
  • 在Android上使用EspressotestingEditText错误
  • 更新2015/10

    现在可以通过AndroidJUnitRunner,这是Androidtesting支持库的一部分 。 简而言之,您需要在基于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)注释你的testing类。

    4. 用正常的JUnit4风格编写testing。

    另请参阅Espresso设置说明 。 请注意,您不需要Espresso本身进行普通的JUnit4testing。

    为什么这是必要的

    在这个话题上,我可以在互联网上find很less的信息。 我发现的最好的是InstrumentationTestRunner的信息。

    没有任何东西可以阻止JUnit4testing在Android设备上运行,就像任何其他Java代码一样。 但是,Androidtesting框架还做了一些额外的工作:

    1. 它通过ADB将testing结果发送回您的开发机器。
    2. 它做仪器(我不确定这涉及到什么)。

    以上是由JUnit3的一些扩展执行的。

    这个JUnit3特定的代码似乎是构成核心Android系统一部分的InstrumentationTestRunner的一部分。 然而,正如AndroidJUnitRunner显而易见的那样,可以使用支持JUnit4或其他框架的自定义testing运行器。

    一个解释(在日本)是这里:

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

    我收集到这个问题是由InstrumentationTestRunner的实现引起的。

    作者的解决scheme是AndroidJUnit4项目。