Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/unit-testing/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Robolectric:Resources$NotFoundException:Android Gradle插件3的字符串资源ID_Android_Unit Testing_Testing_Android Testing_Robolectric - Fatal编程技术网

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
文件中设置
并从命令行运行来重新启动gradle守护程序,可以禁用
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()