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:
- Parse + Robolectric causando java.lang.VerifyError: Tipo incorrecto en pila de operandos
- ¿Cómo burlar el método antes de que se cree la actividad?
- Robolectric with Gradle: Recursos no encontrados
- Cómo escribir la prueba de Robolectric (2.3) usando la base de datos
- ¿Cómo forzar un cambio de configuración en una prueba Android Robolectric?
@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?
- Test Robolectric ListView no se actualiza después de cambios de valor en el adaptador
- Problema con Robolectric con la nueva versión de los servicios de Google Play
- Cambiar la conectividad de Android con Robolectric
- Volver a cargar variables estáticas al inicio de cada prueba de unidad
- Robolectric filenotFound en archivos de activos
- ¿Cómo puedo burlarme del contexto usando Mockito y Robolectric?
- ¿Cómo sobreescribir la URL del repositorio de dependencia de Robolectric?
- ¿Cómo puedo crear una clase de sombra para evitar fallos relacionados con atributos personalizados al probar una aplicación de Android con Robolectric?
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í
- Cómo iterar Arraylist <HashMap <String, String >>?
- Login de Android Facebook "LoginActivity could not be started"