NPE @ android.support.v7.widget.RecyclerView $ LayoutManager.detachViewInternal

Al conmutar del espresso 2.0 a 2.1 estoy tropezando uppon este error extraño:

java.lang.NullPointerException: Attempt to invoke virtual method 'void android.support.v7.widget.ChildHelper.detachViewFromParent(int)' on a null object reference at android.support.v7.widget.RecyclerView$LayoutManager.detachViewInternal(RecyclerView.java:5407) at android.support.v7.widget.RecyclerView$LayoutManager.detachViewAt(RecyclerView.java:5400) at android.support.v7.widget.RecyclerView.setAdapterInternal(RecyclerView.java:647) at android.support.v7.widget.RecyclerView.swapAdapter(RecyclerView.java:594) at org.ligi.passandroid.ui.PassListActivity.onCreate(PassListActivity.java:161) at android.app.Activity.performCreate(Activity.java:5990) at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1106) at android.support.test.runner.MonitoringInstrumentation.callActivityOnCreate(MonitoringInstrumentation.java:489) at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2278) at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2390) at android.app.ActivityThread.access$800(ActivityThread.java:151) at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1303) at android.os.Handler.dispatchMessage(Handler.java:102) at android.os.Looper.loop(Looper.java:135) at android.app.ActivityThread.main(ActivityThread.java:5257) at java.lang.reflect.Method.invoke(Native Method) at java.lang.reflect.Method.invoke(Method.java:372) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:903) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:698) 

El código allí:

  @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); supportRequestWindowFeature(Window.FEATURE_INDETERMINATE_PROGRESS); setContentView(R.layout.pass_list); ButterKnife.inject(this); AXT.at(openFileFAB).setVisibility(Build.VERSION.SDK_INT >= VERSION_STARTING_TO_SUPPORT_STORAGE_FRAMEWORK); final LinearLayoutManager llm = new LinearLayoutManager(this); llm.setOrientation(LinearLayoutManager.VERTICAL); (!!here!!) recyclerView.setLayoutManager(llm); 

No se está estrellando allí cuando acabo de ejecutar la aplicación o la prueba con espresso 2.0

Este es un tema extraño, por lo que voy a dar una resolución que funcionó para mí primero y luego tratar de explicar lo que creo que está sucediendo.

Solución rápida es redeclare sus dependencias de la biblioteca de soporte técnico en la configuración de compilación de prueba:

 androidTestCompile 'com.android.support:support-v4:22.1.1' androidTestCompile 'com.android.support:appcompat-v7:22.1.1' androidTestCompile 'com.android.support:cardview-v7:22.1.1' androidTestCompile 'com.android.support:gridlayout-v7:22.1.1' androidTestCompile 'com.android.support:recyclerview-v7:22.1.1' 

Esto debería solucionar el problema.

La explicación es bastante extraña: parece un espresso-contrib:2.1 depende de una versión anterior de com.android.support:recyclerview-v7:22.0.0 . Esto se puede comprobar con la aplicación de Gradle : dependencias task: ./gradlew app:dependencies . De alguna manera esta dependencia tiene precedencia sobre la declarada en la compilación y la tira abajo a la versión más vieja:

 +--- com.android.support.test.espresso:espresso-contrib:2.1 | +--- com.android.support:recyclerview-v7:22.0.0 | | \--- com.android.support:support-v4:22.0.0 | +--- com.android.support:support-v4:22.0.0 | \--- com.android.support.test.espresso:espresso-core:2.1 (*) 

Esto se puede confirmar mediante la aplicación: dependencyInsight tarea: ./gradlew app:dependencyInsight --configuration androidTestCompile --dependency recyclerview-v7

 com.android.support:recyclerview-v7:22.0.0 \--- com.android.support.test.espresso:espresso-contrib:2.1 \--- androidTestCompile 

El resultado es que la versión de prueba utiliza una versión diferente (de pedido) de recyclerview-v7 que resulta ser buggy. La adición de androidTestCompile ayuda a Gradle a detectar el conflicto y resolverlo correctamente. Después de la corrección:

 com.android.support:recyclerview-v7:22.1.1 (conflict resolution) \--- androidTestCompile com.android.support:recyclerview-v7:22.0.0 -> 22.1.1 \--- com.android.support.test.espresso:espresso-contrib:2.1 \--- androidTestCompile 
  • Actualización de un EditText con Espresso
  • Java.lang.IncompatibleClassChangeError causado por la instanciación de ActivityTestRule
  • Actividad Actual en Espresso android
  • Cómo probar un fragmento usando Espresso
  • ¿Cómo conseguir que Spoon tome capturas de pantalla para las pruebas de Espresso?
  • ¿Es posible tomar una captura de pantalla y probar valores de píxeles con espresso?
  • Android Espresso: ViewPager no tiene instancia de adaptador
  • Android Espresso typeText en EditText en ActionBar
  • AndroidTest Falló al ejecutar desde la línea de comandos: app: connectedDebugAndroidTest
  • ¿Por qué Espresso deja la aplicación una vez finalizada la prueba? Cómo detenerlo de hacer eso
  • Haga que Espresso espere a que WebView termine de cargar
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.