在Android Studio中为单元测试设置自定义资源目录

Phi*_*ons 28 android unit-testing gradle android-studio

我们有一个非常罕见的要求,即我们的Android应用程序执行单元测试,这些测试使用了仅需要进行单元测试的资产.

使用基于Eclipse的SDK,这很简单明了 - 测试项目是一个带有自己资产文件夹的独立项目.对于Android Studio,这意味着可以在build.gradle(或按惯例)配置.

最后,我们的单元测试正在执行,但是我已经用尽了所有关于自定义(和理想情况下,合并)资源文件夹的建议.这是我尝试过的:

  • 在android闭包中向sourceSets添加一个测试闭包(通过闭包我的意思是在build.gradle中的花括号之间).

    androidTest {
        assets.srcDirs = ['src/androidTest/assets/']
    }
    
    Run Code Online (Sandbox Code Playgroud)
  • 同样的事情,但使用"test"作为sourceSet的名称(与上面的"androidTest"相对)以及"instrumentTest".

  • 上述各种组合,加上androidTest.setRoot("测试"),androidTest.setRoot("androidTest"),两者都导致我们的单元测试不能被识别("空套件").

这个问题可以更一般地说是"如何在Android Studio中使用不同的目录进行单元测试".

我们已经浏览了Android的文档,要么我们不理解它,它是错误的,或者某处有错误.

任何帮助将非常感谢.

Phi*_*ons 28

我偶然发现了自己问题的答案,为此,我获得了令人垂涎的"Tumbleweed"奖,该奖项专门用于激发特别值得注意的缺乏兴趣的问题.它永远不会对某人有用.

最后,我将把它描述为Android的gradle构建中的一个错误,但是如果没有任何确凿的文档,那么它将不得不保持一种观点.

似乎"androidTest/assets"似乎不起作用.但是"调试/资产"确实如此.顺便说一下"debug/java"也是如此,因此解决方案是将任何和所有测试资源和代码放入调试根目录,但单元测试本身除外.

我还在build.gradle中添加了以下修改:

    androidTest {
        assets.srcDirs = ['src/main/assets', 'src/androidTest/assets/', 'src/debug/assets/']
        java.srcDirs = ['src/main/java', 'src/androidTest/java', 'src/debug/java']
    }
Run Code Online (Sandbox Code Playgroud)

现在,我正在运行单元测试,使用发布版本未知的资产和模拟.

  • 似乎Google修复了它.我正在使用Android Studio 0.8.6 + gradle 1.12,而"androidTest/assets"文件夹无需任何其他脚本即可运行. (4认同)
  • 对于那些想知道在哪里放置这些 gradle 代码行的人;它是:`android -> sourceSets -> androidTest -> ...` (4认同)

V.S*_*.S. 9

您的问题很可能是您正在尝试访问应用程序(目标上下文)中的资产Context,但androidTest资产实际上驻留在单独的检测上下文中。即像这样:

InstrumentationRegistry.getInstrumentation().getTargetContext().getAssets()
Run Code Online (Sandbox Code Playgroud)

要访问下面的资产,androidTest/assets请使用以下命令:

InstrumentationRegistry.getInstrumentation().getContext().getAssets()
Run Code Online (Sandbox Code Playgroud)

请务必从 导入androidx.test.platform.app,该工具自 2022 年 3 月起尚未弃用。


Yai*_*lka 6

我不知道以前如何,但是我能够创建Android仪器化的单元测试,在其中可以读取测试资产或生产资产。有关更多信息,请参见此答案。

  • 您发送的链接非常有帮助!非常感谢。这应该是公认的答案。 (4认同)