我有一个图书馆项目在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”的内容