¿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

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:

  1. Http://www.codinguser.com/2015/06/how-to-create-shadow-classes-in-robolectric-3/
  2. Https://github.com/jiahaoliuliu/RobolectricSample/blob/master/app-tests/src/main/java/com/jiahaoliuliu/robolectricsample/RobolectricGradleTestRunner.java
  3. 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 ?

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"; } } 

https://github.com/jiahaoliuliu/robolectricForMarshmallow/blob/master/app/src/test/java/com/jiahaoliuliu/robolectricformarshmallow/shadow/MainControllerShadow.java

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); } } 

https://github.com/jiahaoliuliu/robolectricForMarshmallow/blob/master/app/src/test/java/com/jiahaoliuliu/robolectricformarshmallow/MainActivityTest.java

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

  • Cómo detener y reiniciar una actividad en una prueba de instrumentación de Android?
  • Cómo detener una aplicación de Android desde la consola
  • ¿Cómo puedo ejecutar el código en el hilo de la interfaz de usuario en una prueba de Android JUnit sin una actividad?
  • Prueba de una biblioteca de Android con Robolectric
  • Uso de la actividad de no producción para probar con Android Studio
  • ¿Cómo enviar eventos clave a un emulador sin cabeza en una prueba de instrumentación?
  • Android: ejecución de pruebas instrumentadas en el servidor de TeamCity
  • Pruebas de facturación en la aplicación con cuentas de prueba
  • Cómo inyectar el evento de clic con Android UiAutomation.injectInputEvent
  • Prueba de instrumentación para Android - ¿Cómo recibir nueva actividad después del cambio de orientación?
  • Prueba de un servicio de accesibilidad de Android?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.