我有一个图书馆项目在API21使用Robolectric3.0,带有com.android.tools.build:gradle:1.3.1
我想在机器分子测试中使用测试资源(好像在src/androidTest/res/...下),即com.mypackage.test.R.java(而不是com.mypackage.R.java用于生产)。
到目前为止我所拥有的:
目录结构是

src/
  main/
    java
    res
  test/
    java
    // no res here because it's not picked up
  androidTest/
    res    // picked up by androidTest build variant to generate test.R.java

然后在build.gradle中:
android {
  compileSdkVersion 21
  buildToolsVersion = "22.0.1"

  defaultConfig {
    minSdkVersion 15
    targetSdkVersion 21
  }

  sourceSets {
    test {
        java {
            srcDir getTestRJavaDir()
        }
    }
  }
}

def private String getTestRJavaDir(){
  def myManifestRoot = (new XmlParser()).parse("${project.projectDir}/src/main/AndroidManifest.xml")
  def myPackageNamespace = myManifestRoot.@package
  def myPackagePath = myPackageNamespace.replaceAll("\\.", "/")

  return "${project.buildDir}/generated/source/r/androidTest/debug/${myPackagePath}/test"
}

afterEvaluate { project ->
  [tasks.compileDebugUnitTestSources, tasks.compileReleaseUnitTestSources]*.dependsOn("compileDebugAndroidTestSources")
}

我的测试现在用test.r.java成功编译。
但是,在运行时,它们失败了,因为robolectric现在无法找到我的资产文件,因为它们现在位于${project.buildDir}/intermediates/assets/androidTest/debug中,而以前它们位于${project.buildDir}/intermediates/assets/debug中。我怀疑robo也会找不到资源文件,因为它们也被移动到了androidTest(build variant?)目录。
所以有两个问题:1)有没有更好的方法来做到这一点?2)如果没有,如何告诉Robolectric在哪里查找资产文件?
我试过@Config(assetDir="build/intermediates/assets/androidTest/debug")@Config(assetDir="../build/intermediates/assets/androidTest/debug")都没用。

最佳答案

您可以创建自定义roboletric测试运行程序,如:

public class CustomRobolectricGradleTestRunner extends RobolectricGradleTestRunner {

    public CustomRobolectricGradleTestRunner(Class<?> klass) throws InitializationError {
        super(klass);
    }

    // Fix for the NotFound error with openRawResource()
    @Override
    protected AndroidManifest getAppManifest(Config config) {
        String manifest = "src/main/AndroidManifest.xml";
        String res = String.format("../app/build/intermediates/res/merged/%1$s/%2$s", BuildConfig.FLAVOR, BuildConfig.BUILD_TYPE);
        String asset = "src/test/assets";
        return new AndroidManifest(Fs.fileFromPath(manifest), Fs.fileFromPath(res), Fs.fileFromPath(asset));
    }
}

在变量资产中,您可以定义类似“./build/intermediates/assets/androidtest/debug”的内容

07-24 09:49
查看更多