Robolectric:Resources $ NotFoundException:使用Android Gradle Plugin 3的字符串资源ID

ant*_*009 41 testing android unit-testing robolectric android-testing

Android Studio 3.0 Beta2
classpath 'com.android.tools.build:gradle:3.0.0-beta3'
testCompile 'org.robolectric:robolectric:3.4.2'
Run Code Online (Sandbox Code Playgroud)

我正在使用的测试类无法运行:

@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()));
    }
}
Run Code Online (Sandbox Code Playgroud)

这是错误的堆栈跟踪:

android.content.res.Resources$NotFoundException: String resource ID #0x7f0c0020

    at android.content.res.Resources.getText(Resources.java:274)
    at android.content.res.Resources.getString(Resources.java:360)
    at android.content.Context.getString(Context.java:376)
    at org.robolectric.shadows.ShadowActivity.getActivityTitle(ShadowActivity.java:100)
    at org.robolectric.shadows.ShadowActivity.callAttach(ShadowActivity.java:110)
    at org.robolectric.android.controller.ActivityController.attach(ActivityController.java:56)
    at org.robolectric.android.controller.ActivityController.of(ActivityController.java:25)
    at org.robolectric.Robolectric.buildActivity(Robolectric.java:98)
    at org.robolectric.Robolectric.buildActivity(Robolectric.java:94)
    at org.robolectric.Robolectric.setupActivity(Robolectric.java:102)
    at me.androidbox.busbybaking.adapters.RecipeAdapterTest.setup(RecipeAdapterTest.java:63)
Run Code Online (Sandbox Code Playgroud)

Edit Configurations我已经设置了Working Directory$MODULE_DIR$

非常感谢任何建议.

azi*_*ian 75

正如 Google团队的工程师(最有可能是Xavier Ducrohet)所提到的,Robolectric与AAPT2存在问题:

Robolectric与aapt2不兼容.

这里有两个选择.

第一个选项 - 遵循Android Studio 3.0+的 Robolectric 指南

将以下内容添加到build.gradle:

android {
  testOptions {
    unitTests {
      includeAndroidResources = true
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

使用Robolectric测试运行器注释您的测试:

@RunWith(RobolectricTestRunner.class)
public class SandwichTest {
}
Run Code Online (Sandbox Code Playgroud)

第二个选项:禁用AAPT2将以下行添加到gradle.properties文件中:

android.enableAapt2=false
Run Code Online (Sandbox Code Playgroud)

  • 谢谢,看起来像'android.enableAapt2 = false`就可以了. (3认同)

sfe*_*era 7

Robolectric文档指出下面的配置应该与Android 3.x的工作室中使用:

android {
  testOptions {
    unitTests.includeAndroidResources true
  }
}
Run Code Online (Sandbox Code Playgroud)