Robolectric:Resources$NotFoundException:Android Gradle插件3的字符串资源ID
我正在使用的无法运行的测试类:Robolectric:Resources$NotFoundException:Android Gradle插件3的字符串资源ID,android,unit-testing,testing,android-testing,robolectric,Android,Unit Testing,Testing,Android Testing,Robolectric,我正在使用的无法运行的测试类: Android Studio 3.0 Beta2 classpath 'com.android.tools.build:gradle:3.0.0-beta3' testCompile 'org.robolectric:robolectric:3.4.2' 这是错误的堆栈跟踪: @Config(constants = BuildConfig.class, sdk = Build.VERSION_CODES.LOLLIPOP) @RunWith(Robolectri
Android Studio 3.0 Beta2
classpath 'com.android.tools.build:gradle:3.0.0-beta3'
testCompile 'org.robolectric:robolectric:3.4.2'
这是错误的堆栈跟踪:
@Config(constants = BuildConfig.class, sdk = Build.VERSION_CODES.LOLLIPOP)
@RunWith(RobolectricTestRunner.class)
public class RecipeAdapterTest {
private MainActivity activity;
@Before
public void setup() {
activity = Robolectric.setupActivity(MainActivity.class);
/* Also tried this same Error
activity = Robolectric.buildActivity(MainActivity)
.create()
.resume()
.get();
*/
}
@Test
public void testActivityShouldNotBeNull() {
assertThat(activity, is(notNullValue()));
}
}
在编辑配置
中,我已将工作目录
设置为$MODULE\u DIR$
非常感谢您的建议。由谷歌团队的一名工程师(最有可能)提出,Robolectric与AAPT2存在问题:
Robolectric与aapt2不兼容
这里有两种选择
第一种选择-跟随机器人分子
将以下内容添加到build.gradle中:
使用Robolectric test runner为您的测试添加注释:
第二个选项:禁用AAPT2将以下行添加到
gradle.properties
文件中:
@RunWith(RobolectricTestRunner.class)
public class SandwichTest {
}
如果由于
AAPT2
资源处理问题导致构建失败,或者您希望使用RoboeElectric
,通过在gradle.properties
文件中设置
AAPT2
官方指南指出,Android Studio 3.x应使用以下配置:
android.enableAapt2=false
就我而言,以下解决了我的问题: “问题与android studio有关。请转到‘运行’->‘编辑配置…’,并将‘工作目录’值更改为。” $MODULE_DIR$ 运行您的测试 更多信息请参见“使用Android Studio构建”
参考资料:您也可以尝试
@Config(manifest=“/src/main/AndroidManifest.xml”)
,以防您不能简单地包含资源,因为某些项目测试会失败,因为包含了这些资源。(适用于可能正在寻找类似问题解决方案的任何人)
一定要使用
android {
testOptions {
unitTests.includeAndroidResources true
}
}
而不是RuntimeEnvironment.application
当您试图“手动”解析资源时
在这种情况下,
Resources$NotFoundException
可能会与roblectric
一起出现,因为我使用的是浓缩咖啡,所以您需要使用应用程序资源,而不是测试资源
所以不是
RuntimeEnvironment.systemContext
我曾经
InstrumentationRegistry.getInstrumentation().context.resources.getString("key")
这不是对问题的直接回答,但如果您正在测试需要上下文来查询资源的内容,我发现以下内容非常有效:
activityRule.activity.getString("key")
(或者RuntimeEnvironment.application——但这是不赞成的,赞成上面的做法)当您从命令行和gradle运行它时,是否会看到相同的错误?如果我在Android Studio 2.3.3中打开项目,使用gradle 2.3.3版,并设置jackOptions{enabled true}和compileOptions,这会起作用{sourceCompatibility JavaVersion.VERSION_1_8 targetCompatibility JavaVersion.VERSION_1_8}
jack
已被删除。如果您不在build.gradle
文件中进行修改,您可以从命令行成功运行它吗?我已恢复到AS 3.0。我已在命令行/gradlew test
上运行了测试,我遇到了与以前相同的问题NotFoundException
谢谢android.enableapt2=false
可以解决这个问题。这是可行的,但是禁用此选项:android.enableapt2=false
会导致其他错误。现在我们必须为字符串资源添加一个参数。也许有更好的解决方案?现在不推荐使用android.enableapt2=false
InstrumentationRegistry.getInstrumentation().context.resources.getString("key")
activityRule.activity.getString("key")
ApplicationProvider.getApplicationContext()