4

API21 で robolectric 3.0 を使用するライブラリ プロジェクトを持っていcom.android.tools.build:gradle:1.3.1ます。

テストリソースを( の下のようにsrc/androidTest/res/...)、つまりcom.mypackage.test.R.javacom.mypackage.R.java本番用ではなく)robolectric テストで使用したい。

私がこれまでに持っているもの:

ディレクトリ構造は

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 で正常にコンパイルされるようになりました。

ただし、${project.buildDir}/intermediates/assets/androidTest/debug以前は${project.buildDir}/intermediates/assets/debug. androidTest私の疑いでは、リソース ファイルも(ビルド バリアント?) ディレクトリの下に移動されているため、robo もリソース ファイルを見つけられないのではないかと考えています。

2 つの質問: 1) これを行うためのより良い方法はありますか? 2) 存在しない場合、資産ファイルを探す場所を robolectric に伝えるにはどうすればよいですか?

私は試してみましたが@Config(assetDir="build/intermediates/assets/androidTest/debug")@Config(assetDir="../build/intermediates/assets/androidTest/debug")役に立ちませんでした。

4

2 に答える 2

4

次のようなカスタム 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」のようなものを定義できます

于 2015-11-06T13:57:35.007 に答える