¿Cómo crear sombras personalizadas en robolectric 3.0?
Necesito simular algunas clases personalizadas (crear para ello una sombra). Ya he leído en http://robolectric.org/custom-shadows/ cómo hacer esto.
Así que tengo algo de clase
- ¿Pruebas beta de Google Play sin una aplicación publicada?
- Android Marshmallow Permisos de Pruebas
- Java y la metodología de prueba de Android
- Android en las pruebas de suscripción de aplicaciones
- La forma más rápida de probar el código fuente de Android modificado?
public class MyClass { public static int regularMethod() { return 1; } }
Creo una sombra:
@Implements(MyClass.class) public class MyShadowClass { @Implementation public static int regularMethod() { return 2; } }
Y pongo la sombra en Test-class:
@RunWith(RobolectricGradleTestRunner.class) @Config(constants = BuildConfig.class, shadows={MyShadowClass.class}) public class MyTest { @Test public void testShadow() { assertEquals(2, MyClass.regularMethod()); } }
Pero la sombra no se usa.
java.lang.AssertionError: Expected :2 Actual :1
¿Cómo hacer visible cualquier sombra personalizada para RobolectricGradleTestRunner?
Ya lo he intentado:
- Http://www.codinguser.com/2015/06/how-to-create-shadow-classes-in-robolectric-3/
- Https://github.com/jiahaoliuliu/RobolectricSample/blob/master/app-tests/src/main/java/com/jiahaoliuliu/robolectricsample/RobolectricGradleTestRunner.java
- Método nativo simulador con una clase de sombra Robolectric Custom
Pero obtengo varios errores de compilación, como
-
InstrumentingClassLoaderConfig
no encontrado - No se ha encontrado la
Setup
Cómo utilizar sombras personalizadas correctamente en robolectric 3.0 ?
- Deshabilitar eventos a nivel de sistema en Android mono
- ¿Cómo puedo comprobar en Robotium que la aplicación ha terminado?
- ¿Hay un comando ADB para habilitar / deshabilitar datos móviles? (Dispositivo enraizado)
- Prueba de GPS en Android
- Destruye y reinicia la actividad con la biblioteca de soporte de pruebas
- Mockito en el emulador de Android
- Espresso prueba pegado / inactivo después de realizar (haga clic ()) en el botón en ViewAnimator
- Android: ¿Cómo puedo guardar, borrar y restaurar SharedPreferences para la prueba de unidades?
Sombras personalizadas deben ser evitados y debe ser un último recurso de zanja. Sólo debe utilizarse si no puede hacer mucho refactor en su código que le impide ejecutar sus pruebas como una llamada de método nativo. Es mejor burlar el objeto de esa clase o espiar usando powermock o mockito que sombra personalizada. Si es un método estático, utilice powermock.
En nuestro proyecto, teníamos una clase que tenía algunos métodos nativos y era la clase de configuración utilizada en todas partes en la aplicación. Así que cambiamos los métodos nativos a otra clase y lo sombreamos. Esos métodos nativos estaban fallando los casos de prueba.
De todos modos aquí está cómo usted puede sombra de encargo en robolectric 3.0:
Cree un corredor de prueba personalizado que extienda RobolectricGradleTestRunner:
public class CustomRobolectricTestRunner extends RobolectricGradleTestRunner { public CustomRobolectricTestRunner(Class<?> klass) throws InitializationError { super(klass); } public InstrumentationConfiguration createClassLoaderConfig() { InstrumentationConfiguration.Builder builder = InstrumentationConfiguration.newBuilder(); builder.addInstrumentedPackage("com.yourClassPackage"); return builder.build(); }
Asegúrese de que el paquete no contiene ningún caso de prueba que esté ejecutando con robolectric.
Soy Jiahao, el creador del segundo repositorio al que se está refiriendo.
En primer lugar, gracias por comprobar mi código. Hago muchas investigaciones en Android y me alegro de que mi investigación sea útil para otra persona.
Entonces, la Sombra sobre Robolectric. Estoy utilizando Robolectric 3.1 en este proyecto, para probar cómo Robolectric 3 funciona con MarshMallow: https://github.com/jiahaoliuliu/robolectricForMarshmallow
He estado probando el nuevo Administrador de permisos de ejecución, así como la aplicación de sombra y las actividades.
Aquí está un ejemplo de código de la actividad sombreada:
import android.content.Context; import com.jiahaoliuliu.robolectricformarshmallow.controller.MainController; import org.robolectric.annotation.Implementation; import org.robolectric.annotation.Implements; /** * Created by Jiahao on 7/18/16. */ @Implements(MainController.class) public class MainControllerShadow { public void __constructor__ (Context context) { // Not do anything } @Implementation public String getTextToDisplay(boolean permissionGranted) { return "Test"; } }
Y esto es cómo lo estoy usando en la prueba unitaria:
Paquete com.jiahaoliuliu.robolectricformarshmallow;
import com.jiahaoliuliu.robolectricformarshmallow.shadow.MainControllerShadow; import org.junit.After; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import org.robolectric.Robolectric; import org.robolectric.RobolectricGradleTestRunner; import org.robolectric.annotation.Config; import static org.junit.Assert.*; /** * Created by Jiahao on 6/30/16. */ @RunWith(RobolectricGradleTestRunner.class) @Config(constants = BuildConfig.class, manifest = Config.NONE, application = FoolApplication.class, shadows = { MainControllerShadow.class}, sdk = 18) public class MainActivityTest { private MainActivity mMainActivity; @Before public void setUp() throws Exception { mMainActivity = Robolectric.setupActivity(MainActivity.class); } @After public void tearDown() throws Exception { } @Test public void testOnCreate() throws Exception { // Simple test to know that it works assertTrue(true); } }
Como puede ver, no estoy usando Gradle Test Runner personalizado. He comprobado el código fuente de Robolectric, para la versión 3.0 y 3.1 (la última) es suficiente para especificar las clases de sombra en el encabezado.
Espero que ayude
- Marcador de Facebook Las llamadas de la API de Android no muestran puntuaciones altas en Timeline / ticker
- Body.setTransform no funciona dentro del oyente de contacto (andEngine y box2d)