Pruebas Robolectric que se ejecutan en Android Studio pero no en la línea de comandos

Estoy tratando de ejecutar pruebas de unidad usando Robolectric; Funcionan muy bien bajo Android Studio, pero las mismas pruebas faltan cuando se ejecuta en la línea de comandos – que es un gran problema, tengo que ser capaz de ejecutarlos desde mi plataforma de integración continua, no sólo de un IDE.

Sospecho que me falta algún argumento de línea de comandos (digamos, un classpath o algo similar) o llamar a la tarea equivocada – de lo contrario la prueba no se ejecutaría en absoluto desde Android Studio. Algunos detalles relevantes; La prueba se ve así:

@RunWith(RobolectricTestRunner.class) @Config(manifest = "app/src/main/AndroidManifest.xml", resourceDir = "res", emulateSdk = 19) public class SplashActivityTest { @Test public void testActivity() { SplashActivity splashActivity = new SplashActivity(); String appName = splashActivity.getString(R.string.app_name); // HERE, line 20 assertEquals(appName, "App"); } } 

Como se mencionó anteriormente, funciona bien en Android Studio (haciendo clic con el botón derecho del ratón en el archivo de prueba y seleccionando Run 'SplashActivityTest' ), pero al ejecutarlo desde la línea de comandos falla en la línea marcada con HERE con el siguiente rastreo de pila:

 android.content.res.Resources$NotFoundException: unknown resource 2131492893 at org.robolectric.shadows.ShadowAssetManager.getAndResolve(ShadowAssetManager.java:309) at org.robolectric.shadows.ShadowAssetManager.getResourceText(ShadowAssetManager.java:69) at android.content.res.AssetManager.getResourceText(AssetManager.java) at android.content.res.Resources.getText(Resources.java:240) at org.robolectric.shadows.ShadowResources.getText(ShadowResources.java:361) at android.content.res.Resources.getText(Resources.java) at android.content.res.Resources.getString(Resources.java:330) at org.robolectric.shadows.ShadowContext.getString(ShadowContext.java:39) at org.robolectric.shadows.ShadowContextWrapper.getString(ShadowContextWrapper.java:69) at android.content.Context.getString(Context.java) at path.to.myApp.activities.SplashActivityTest.testActivity(SplashActivityTest.java:20) // ... and so on ... 

Estoy usando esto para ejecutar desde la línea de comandos (observe que aquí y en Android Studio estoy usando el contenedor Gradle):

 project-root$ ./gradlew test --continue 

Además: estoy usando Android Studio 1.1.0 , la versión de Gradle es 2.3 , la versión de Robolectric es 3.0-SNAPSHOT y la versión de plugin de Gradle de Robolectric es 1.0.1

2 Solutions collect form web for “Pruebas Robolectric que se ejecutan en Android Studio pero no en la línea de comandos”

Resulta que este es un problema conocido. Los recursos de un proyecto se buscan en el directorio incorrecto cuando se ejecutan las pruebas desde la línea de comandos; aquí hay un enlace al problema; Por ahora la solución es escribir un corredor de prueba personalizado como se muestra aquí :

 public class RobolectricGradleTestRunner extends RobolectricTestRunner { public RobolectricGradleTestRunner(Class<?> testClass) throws InitializationError { super(testClass); String buildVariant = (BuildConfig.FLAVOR.isEmpty() ? "" : BuildConfig.FLAVOR+ "/") + BuildConfig.BUILD_TYPE; String intermediatesPath = BuildConfig.class.getResource("").toString().replace("file:", ""); intermediatesPath = intermediatesPath.substring(0, intermediatesPath.indexOf("/classes")); System.setProperty("android.package", BuildConfig.APPLICATION_ID); System.setProperty("android.manifest", intermediatesPath + "/manifests/full/" + buildVariant + "/AndroidManifest.xml"); System.setProperty("android.resources", intermediatesPath + "/res/" + buildVariant); System.setProperty("android.assets", intermediatesPath + "/assets/" + buildVariant); } } 

Los casos de prueba deben actualizarse en consecuencia para utilizar el corredor de prueba personalizado en lugar de la anotación @Config :

 @RunWith(RobolectricGradleTestRunner.class) public class SplashActivityTest { // tests same as before } 

Además, se recomienda realizar una clean al ejecutar las pruebas desde la línea de comandos, dado que la solución depende del contenido del directorio de compilación, no queremos tener datos obsoletos allí:

 project-root$ ./gradlew clean test --continue 

He resuelto el mismo error, pero de manera diferente. Utilicé sombras de la clase de encargo en pruebas, así que tengo que crear mi propia clase de TestRunner, como esto:

 public class MyRobolectricTestRunner extends RobolectricTestRunner { public MyRobolectricTestRunner(Class<?> klass) throws InitializationError { super(klass); } public InstrumentationConfiguration createClassLoaderConfig() { InstrumentationConfiguration.Builder builder = InstrumentationConfiguration.newBuilder(); builder.addInstrumentedClass(AppUtils.class.getName()); return builder.build(); } } 

Pero encima del código sólo funcionaba cuando ejecutaba la prueba de unidad del estudio Andorid. Por favor, compruebe el código que funciona para mí en ambos sentidos: en Studio y desde la línea de comandos :

 public class MyRobolectricTestRunner extends RobolectricTestRunner { public MyRobolectricTestRunner(Class<?> klass) throws InitializationError { super(klass); } @Override public InstrumentationConfiguration createClassLoaderConfig() { InstrumentationConfiguration.Builder builder = InstrumentationConfiguration.newBuilder(); builder.addInstrumentedPackage(com.example.stackoverflow.AppUtils.class.getPackage().getName()); return builder.build(); } } 

Tenga en cuenta que tengo la dependencia:

 testCompile 'org.robolectric:robolectric:3.0' 
  • Android Robolectric y elementos decorativos vectoriales
  • Prueba de unidad de Android con Retrofit2 y Mockito o Robolectric
  • Robolectric lanza Recursos $ NotFoundException al intentar acceder al recurso en la carpeta raw
  • Robolectric InflateException al utilizar la biblioteca de soporte v7 AlertDialog
  • Robolectric no utiliza ShadowWebView como la superclase de una clase que extiende WebView. MustOverrideException en su lugar
  • Robolectric: ejecutar múltiples pruebas falla
  • Manifiesto y problemas de configuración para conseguir que Robolectric trabaje con Android Studio 1.1.0
  • Prueba de fragmentos con Robolectric 3.0
  • ¿Cómo puedo ignorar los fallos de las pruebas con el complemento rolelectrico gradle?
  • Assert ImageView se cargó con un ID de recurso específico extraíble
  • Problema con Robolectric con la nueva versión de los servicios de Google Play
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.