【问题标题】:How to create test classes that can be used in both Android tests and unit tests?如何创建可用于 Android 测试和单元测试的测试类?
【发布时间】:2015-10-16 14:33:39
【问题描述】:

在为应用程序模块编写测试时,我经常发现自己在为 Android 测试 /androidTest 和单元测试 /test 复制完全相同的一组测试类,例如模拟或助手。

例如,我有一些静态函数可以帮助我在 /test/MockUtils.java 中快速设置模拟但是,我不能在我的任何 Android 测试中重用这个助手类,因为它们不共享相同的类路径 - /androidTest vs /test.

我想过创建一个只包含测试资源的新模块。但是,这个想法不会成功,因为 Android Gradle 插件拒绝依赖应用模块。

项目 testCommon 解析为不支持作为编译依赖项的 APK 存档。

有没有其他方法可以创建可以在 Android 测试和单元测试中重复使用的测试类?

【问题讨论】:

标签: android unit-testing testing


【解决方案1】:

注意:这是一个理论上的解决方案,我还没有尝试过。

第 1 步:在您尝试为其设置共享测试代码的模块中创建一个 testSrc/ 目录。

第 2 步:将共享代码放入该目录(带有基于 Java 包的适当子目录)。

第 3 步:在模块的 build.gradle 文件中的 android 闭包中添加以下闭包:

sourceSets {
    androidTest {
        java.srcDirs <<= 'testSrc'
    }

    test {
        java.srcDirs <<= 'testSrc'
    }
}

这应该告诉 Gradle for Android testSrcandroidTesttest 源集中 Java 代码的另一个源目录。

【讨论】:

  • 我不得不修改您的解决方案,因为 leftShift 由于某种原因不起作用。我不得不重新声明路径 test { java.srcDirs =[ 'src/test','testSrc'] } 你可以编辑你的解决方案以便我可以接受吗?
  • @SomeNoobStudent:您使用左移运算符的具体症状是什么?我刚刚创建了一个新项目,按照我的答案中的步骤,在 Android Studio 中同步了 Gradle 文件,我没有收到任何构建错误。我什至能够运行测试,尽管 testSrc/ 目录是空的。
  • 我在 IntelliJ 14.1.4/Plugin 1.2.3/Gradle 2.4-all 上使用 &lt;&lt; 效果为 0 - IDE 不会突出显示绿色路径,并且其中的类被忽略,不允许我在测试中引用它们。
  • @SomeNoobStudent:嗯...我想找到一种不会强迫您对现有路径进行硬编码的语法,以防万一发生变化。我可以在 Android Studio 1.2.2 上重现您的“IDE 不突出显示绿色路径”效果。如果可以,请尝试java.srcDirs=[java.srcDirs[0],'testSrc']。这给了我一个绿色的结果。
  • @CommonsWare java.srcDirs=[java.srcDirs[0],'testSrc'] 为我工作,只要 testSrc 位于 MODULE_NAME/testSrc。如果试图将它放在 MODULE_NAME/src/testSrc 下(与其他源代码一起保存),我必须使用 java.srcDirs=[java.srcDirs[0], 'src/testSrc'] 或 java.srcDirs=[ java.srcDirs[0], 'src/testSrc/java'] 如果您的代码位于 testSrc/java (这是 test/androidTest 的结构)。我还没有弄清楚如何在没有硬编码的 build.gradle 中引用 MODULE_NAME/src
【解决方案2】:

基于 CommonsWare 的解决方案和 https://code.google.com/p/android/issues/detail?id=181391,添加附加类路径的正确方法是使用 +=&lt;&lt;= 运算符。

sourceSets {
    androidTest {
        java.srcDirs <<= 'testSrc'
    }

    test {
        java.srcDirs += 'testSrc'
    }
}

【讨论】:

    【解决方案3】:

    下面博客中描述的解决方案对我有帮助。

    http://blog.danlew.net/2015/11/02/sharing-code-between-unit-tests-and-instrumentation-tests-on-android/

    我将共享测试代码放入 src/sharedTest/java 。然后我在 build.gradle 中添加了以下代码:

    <pre>
    android {  
      sourceSets {
        String sharedTestDir = 'src/sharedTest/java'
        test {
          java.srcDir sharedTestDir
        }
        androidTest {
          java.srcDir sharedTestDir
        }
      }
    }
    </pre>
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-12-24
      • 1970-01-01
      • 1970-01-01
      • 2016-06-21
      • 2017-09-11
      • 2011-05-07
      • 1970-01-01
      • 2018-06-24
      相关资源
      最近更新 更多