Obteniendo java.lang.RuntimeException: Stub al ejecutar Robolectric a través de Maven

Bueno, estoy teniendo un error extraño. Cuando ejecuto mi prueba a través de IntelliJ, pasa sin ningún problema. Pero si lo ejecuto usando el plugin de Sure-Fire o el comando 'mvn clean test', obtengo la siguiente excepción:

shouldLoadMoreDataOnScrollBeyondTheThreshold(br.com.cybereagle.androidwidgets.listener.EndlessScrollListenerTest) Time elapsed: 2.73 sec <<< ERROR! java.lang.RuntimeException: Stub! at junit.framework.Assert.assertTrue(Assert.java:6) at br.com.cybereagle.androidwidgets.listener.EndlessScrollListenerTest.shouldLoadMoreDataOnScrollBeyondTheThreshold(EndlessScrollListenerTest.java:36) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:616) at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:44) at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:15) at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:41) at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:20) at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:28) at org.robolectric.RobolectricTestRunner$2.evaluate(RobolectricTestRunner.java:246) at org.junit.runners.BlockJUnit4ClassRunner.runNotIgnored(BlockJUnit4ClassRunner.java:79) at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:71) at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:49) at org.junit.runners.ParentRunner$3.run(ParentRunner.java:193) at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:52) at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:191) at org.junit.runners.ParentRunner.access$000(ParentRunner.java:42) at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:184) at org.robolectric.RobolectricTestRunner$1.evaluate(RobolectricTestRunner.java:181) at org.junit.runners.ParentRunner.run(ParentRunner.java:236) at org.apache.maven.surefire.junit4.JUnit4TestSet.execute(JUnit4TestSet.java:59) at org.apache.maven.surefire.suite.AbstractDirectoryTestSuite.executeTestSet(AbstractDirectoryTestSuite.java:120) at org.apache.maven.surefire.suite.AbstractDirectoryTestSuite.execute(AbstractDirectoryTestSuite.java:103) at org.apache.maven.surefire.Surefire.run(Surefire.java:169) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:616) at org.apache.maven.surefire.booter.SurefireBooter.runSuitesInProcess(SurefireBooter.java:350) at org.apache.maven.surefire.booter.SurefireBooter.main(SurefireBooter.java:1021) 

Esta es mi prueba:

 @RunWith(RobolectricTestRunner.class) @Config(manifest = Config.NONE) public class EndlessScrollListenerTest { private ListView listView; private EndlessScrollListener endlessScrollListener; @Before public void setUp() throws Exception { listView = mock(ListView.class); when(listView.getHeaderViewsCount()).thenReturn(0); when(listView.getFooterViewsCount()).thenReturn(0); endlessScrollListener = spy(new TestEndlessScrollListener(5)); } @Test public void shouldLoadMoreDataOnScrollBeyondTheThreshold() { doReturn(true).when(endlessScrollListener).hasMoreDataToLoad(); assertTrue(endlessScrollListener.isLoading()); endlessScrollListener.onScroll(listView, 2, 5, 20); assertFalse(endlessScrollListener.isLoading()); endlessScrollListener.onScroll(listView, 15, 5, 20); assertTrue(endlessScrollListener.isLoading()); endlessScrollListener.onScroll(listView, 21, 5, 40); assertFalse(endlessScrollListener.isLoading()); endlessScrollListener.onScroll(listView, 35, 5, 40); assertTrue(endlessScrollListener.isLoading()); endlessScrollListener.onScroll(listView, 38, 5, 60); assertFalse(endlessScrollListener.isLoading()); doReturn(false).when(endlessScrollListener).hasMoreDataToLoad(); endlessScrollListener.onScroll(listView, 55, 5, 60); assertFalse(endlessScrollListener.isLoading()); verify(endlessScrollListener, atMost(6)).hasMoreDataToLoad(); verify(endlessScrollListener, times(1)).loadMoreData(1); verify(endlessScrollListener, times(1)).loadMoreData(2); verify(endlessScrollListener, never()).loadMoreData(3); } private static class TestEndlessScrollListener extends EndlessScrollListener { private TestEndlessScrollListener(int visibleThreshold) { super(visibleThreshold); } @Override protected boolean hasMoreDataToLoad() { return false; } @Override protected void loadMoreData(int page) { } } } 

El error ocurre en el primer assertTrue:

 assertTrue(endlessScrollListener.isLoading()); 

Lo más extraño es que según el stacktrace, sucede dentro del método assertTrue.

Estas son mis dependencias de maven:

 <dependencies> <dependency> <groupId>android</groupId> <artifactId>android</artifactId> <version>${android.version}</version> <scope>provided</scope> </dependency> <dependency> <groupId>com.google.android</groupId> <artifactId>support-v4</artifactId> <version>${support.v4.version}</version> <scope>compile</scope> </dependency> <dependency> <groupId>com.google.android</groupId> <artifactId>support-v7-appcompat</artifactId> <version>${support.v7.version}</version> <scope>provided</scope> <type>jar</type> </dependency> <dependency> <groupId>org.robolectric</groupId> <artifactId>robolectric</artifactId> <version>${robolectric.version}</version> <scope>test</scope> </dependency> <dependency> <groupId>org.hamcrest</groupId> <artifactId>hamcrest-core</artifactId> <version>1.2</version> <scope>test</scope> </dependency> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.8.2</version> <scope>test</scope> </dependency> </dependencies> 

Como he dicho, funciona dentro de IntelliJ.

Otro detalle es que tengo otro proyecto que genera un JAR que está utilizando el Robolectric normalmente tanto de IntelliJ como de Maven.

¿Alguna idea de lo que está sucediendo?

Bueno, mi problema era que estaba importando desde el paquete equivocado:

 import static junit.framework.Assert.assertFalse; import static junit.framework.Assert.assertTrue; 

Lo cambié a:

 import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertTrue; 

Ahora está funcionando como se esperaba. No sé por qué estaba funcionando en el IntelliJ.

Eso es tonto, pero la dependencia en movimiento de junit y ponerlo antes dependencias de Android va a resolver su problema. Así que su maven debe ser así:

 depndencies -junit -android 

Mueva la dependencia junit hasta la cadena en sus bibliotecas de referencia y funcionará. Ver aquí

  • Puede (debe) robolectric utilizarse para probar el filtro de intención
  • ¿Cómo puedo detectar con Robolectric que onBackPressed se llama programáticamente?
  • Cómo probar el servicio remotel
  • JaCoCo no trabaja con pruebas Robolectric
  • Algo falta en mi proyecto de prueba de Android?
  • Pruebe la carpeta de recursos con Robolectric y Gradle
  • Obtención del campo `ViewDataBinding` de actividad dentro de la prueba de unidad 'Robolectric` después de ser asignado
  • Pruebas unitarias Robolectric fallan después de Multidex
  • Las pruebas Robolectric fallan cuando se ejecutan en CLI
  • Android + Robolectric - RuntimeException / InstantiationException en queryBuilder.query () en ContentProvider
  • Prueba de AsyncTaskLoaders con Robolectric
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.