我在API21上有一个使用robolectric 3.0的库项目,com.android.tools.build:grad:1.3.1.
我想在robolectric测试中使用测试资源(好像在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} / intermediateiates /资产/调试.我怀疑机器人也无法找到资源文件,因为它们也被移动到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”的内容