【问题标题】:Method setUp in android.test.AndroidTestCase not mockedandroid.test.AndroidTestCase 中的方法 setUp 未模拟
【发布时间】:2015-02-27 09:14:10
【问题描述】:

我正在尝试接受 Android Studio 的新单元测试功能。 我已按照http://tools.android.com/tech-docs/unit-testing-support 上的说明进行操作。那里的描述明确提到了“方法...未模拟”错误,并建议将以下内容放入build.gradle

android {
  // ...
  testOptions { 
    unitTests.returnDefaultValues = true
  }
}

这适用于从命令行启动时运行的测试

gradlew test --continue

但当我通过右键单击从 Android Studio 运行测试类时 -> 运行。这样,我又得到了同样的错误:

java.lang.RuntimeException: Method setUp in android.test.AndroidTestCase not mocked. See https://sites.google.com/a/android.com/tools/tech-docs/unit-testing-support for details.
    at android.test.AndroidTestCase.setUp(AndroidTestCase.java)
    at org.junit.internal.runners.JUnit38ClassRunner.run(JUnit38ClassRunner.java:86)
    at org.junit.runner.JUnitCore.run(JUnitCore.java:137)
    at com.intellij.junit4.JUnit4IdeaTestRunner.startRunnerWithArgs(JUnit4IdeaTestRunner.java:74)
    at com.intellij.rt.execution.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:211)
    at com.intellij.rt.execution.junit.JUnitStarter.main(JUnitStarter.java:67)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
    at com.intellij.rt.execution.application.AppMain.main(AppMain.java:134)

关于如何解决这个问题的任何想法?

编辑:测试类的内容并不重要,因为测试的设置失败,我尝试了最简单的类:

public class ContactFormToolTest extends AndroidTestCase {    

    public void testSOmething(){
        assertEquals(false, true);
    }            
}

也试过覆盖setUp,没有区别。

【问题讨论】:

  • 你可以添加你的测试类的代码吗?
  • 查看有问题的编辑。
  • 我有一个非常相似的输出,通过这种方式解决:使用 MainActivity 创建一个全新的 android 项目。打开主活动。将光标放在类定义中的“MainActivity”上。右键单击并选择 GoTo => Test。使用建议的参数创建一个新的测试文件。尝试运行一个简单的测试。如果这可行,请将您的所有文件复制到这个新项目中。丑陋,但它对我有用。猜猜我错过了一些小设置。
  • 如果设置失败,是否可以添加设置代码?
  • 它没有失败,它甚至没有被执行。当 setUp 为空时也会发生同样的情况。

标签: android unit-testing android-studio


【解决方案1】:

发件人:https://sites.google.com/a/android.com/tools/tech-docs/unit-testing-support#TOC-Method-...-not-mocked.-

用于运行单元测试的 android.jar 文件不包含 任何实际代码 - 由 Android 系统映像提供 设备。相反,所有方法都会抛出异常(默认情况下)。这是 确保您的单元测试只测试您的代码而不依赖于 Android 平台的任何特定行为(您没有 明确嘲笑,例如使用模拟)。如果这证明有问题,你 可以将下面的 sn-p 添加到你的 build.gradle 来改变它 行为:

android {

   // ...   

  testOptions { 
      unitTests.returnDefaultValues = true   
  } 
}

【讨论】:

  • 这是做什么的,给android.jar添加真正的实现?
  • 我的猜测是 android.jar 的每个方法都会返回一些默认(虚拟)值,以便测试可以运行
【解决方案2】:

Android Studio 中的新 Unit Tests 功能伪造了整个 Android SDK,这样您就可以运行快速的纯 Java 测试,而无需在 Android 设备上安装您的应用程序(这类似于到 Robolectric)。一般的想法是模拟来自 Android SDK 调用的所有响应。

AndroidTestCase 用于使用 real Android SDK 运行测试。

因此,您的问题是您尝试运行依赖于 Android SDK 的 AndroidTestCase,但您的测试运行程序正在启动 Unit Tests 环境,该环境使用假的 Android SDK 而不是真实的。

您需要选择一种方法。如果您想要一个纯单元测试,那么您可能应该使用 JUnit 4 测试类而不是 AndroidTestCase。更多说明: https://developer.android.com/training/testing/unit-testing/local-unit-tests.html#build

【讨论】:

  • 这个测试赌注不能移动到 androidTest 包吗?
  • 新的 Android Studio 单元测试功能是否会让 Robolectric 变得多余?
【解决方案3】:

从 SDK 版本 24 开始,AndroidTestCase is deprecated

此类已在 API 级别 24 中弃用。

改用 InstrumentationRegistry。新的测试应该使用 Android Testing Support Library

您应该使用 Espresso 框架进行 UI 测试。有a tutorial

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-02
    • 2020-05-24
    • 2023-01-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多