android android-studio robolectric robolectric-gradle-plugin

android - Recursos $ NotFoundException cuando se ejecuta la prueba Roboeléctrica



android-studio robolectric (2)

Acabo de configurar Roboelectric 3.2.2 con una nueva aplicación y escribí mi primera prueba simple:

@RunWith(RobolectricTestRunner.class) @Config(manifest="src/main/AndroidManifest.xml", packageName="my.pacakge.name.debug") public class MainActivityTest { @Test public void clickButton() { MainActivity mainActivity = Robolectric.setupActivity(MainActivity.class); String text = ((TextView)mainActivity.findViewById(R.id.text_main)).getText().toString(); assertEquals("Should equal Hello World!", "Hello World!", text); } }

He seguido toda la configuración e instrucciones aquí y aquí, pero sigo recibiendo este error cada vez que intento ejecutar la prueba:

android.content.res.Resources$NotFoundException: Unable to find resource ID #0x0 in packages [android, my.package.name.debug]

Esta excepción ocurre en la primera línea de la prueba, donde estoy llamando a setupActivity() .


Este complemento funciona para mí cuando se usa RobolectricTestRunner personalizado y proporciona las propiedades del sistema que faltan.

public class CustomRobolectricTestRunner extends RobolectricTestRunner { public CustomRobolectricTestRunner(Class<?> testClass) throws InitializationError { super(testClass); String buildVariant = BuildConfig.BUILD_TYPE + (BuildConfig.FLAVOR.isEmpty()? "" : "/" + BuildConfig.FLAVOR); System.setProperty("android.package", BuildConfig.APPLICATION_ID); System.setProperty("android.manifest", "build/intermediates/manifests/full/" + buildVariant + "/AndroidManifest.xml"); System.setProperty("android.resources", "build/intermediates/res/" + buildVariant); System.setProperty("android.assets", "build/intermediates/assets/" + buildVariant); } }

Editar: También debe usar un directorio de trabajo diferente en la configuración de ejecución de prueba de su unidad. Lo mejor es cambiar la configuración predeterminada y usar $ MODULE_DIR $ https://code.google.com/p/android/issues/detail?id=158015#c5


Me funcionó: agregue @Config(manifest = "src/main/AndroidManifest.xml")

@Config(manifest = "src/main/AndroidManifest.xml") @RunWith(RobolectricTestRunner.class) public class MainActivityTest { @Test public void testSomething() throws Exception { assertTrue(Robolectric.setupActivity(MainActivityTest .class) != null); } }

Nota 1: Si aún obtiene el mismo error (ocurre al crear un nuevo proyecto)

La razón está relacionada con el directorio de trabajo diferente y la respuesta está aquí: https://.com/a/31469526/4802664

Nota 2: Uso

Android Studio 3.0 (canario 9)
Gradle 4.1
Android Gradle plugin 3.0.0-alpha9
robolectric: 3.4.2

Gradle

buildscript { repositories { google() jcenter() } dependencies { classpath ''com.android.tools.build:gradle:3.0.0-alpha9'' } } dependencies { implementation fileTree(dir: ''libs'', include: [''*.jar'']) implementation ''com.android.support.constraint:constraint-layout:1.0.2'' testImplementation ''junit:junit:4.12'' // Espresso androidTestImplementation ''com.android.support.test:runner:1.0.0'' androidTestImplementation ''com.android.support.test.espresso:espresso-core:3.0.0'' // Robolectric testImplementation ''org.hamcrest:hamcrest-library:1.3'' testImplementation ''org.robolectric:robolectric:3.4.2'' }