Join FlipAndroid.COM Telegram Group: https://t.me/joinchat/F_aqThGkhwcLzmI49vKAiw


Actividad de prueba onCreate Exception

Tengo la siguiente actividad que lanza una excepción si algo está configurado mal.

public class MyActivity extends AppCompatActivity { @Override protected void onCreate(final Bundle savedInstanceState) { super.onCreate(savedInstanceState); throw new IllegalStateException("something went wrong"); } } 

He intentado escribir una prueba para este ActivityInstrumentationTestCase2

  • Firebase se bloquea en ninguna conexión a Internet
  • ¿Puede el nuevo constructor File () devolver null en Android?
  • ¿Hay una manera de pasar parámetros a un Runnable?
  • Restablecer Factory de Android mediante programación
  • Nuevo paquete aún no registrado en el sistema. Error en un teléfono real
  • ¿Cómo puede reservar un nombre para una aplicación?
  •  public void testException() throws Exception { try { getActivity().onCreate(null); fail(); } catch (IllegalStateException e) { assertThat(e.getMessage()).contains("something went wrong"); } } 

    Que arroja la Exception correcta, pero no se ejecuta en mi bloqueo de catch debido a algún Sandboxing interno de ActivityInstrumentationTestCase2 .

    Así que lo probé con Java simple

     public void testException() throws Exception { final MockNavigationDrawerActivity activity = Mockito.mock(MockNavigationDrawerActivity.class); Mockito.doCallRealMethod().when(activity).onCreate(null); try { activity.onCreate(null); fail(); } catch (IllegalStateException e) { assertThat(e.getMessage()).contains("something went wrong"); } } 

    Que no funciona

     java.lang.AbstractMethodError: abstract method "boolean org.mockito.internal.invocation.AbstractAwareMethod.isAbstract()" at org.mockito.internal.invocation.InvocationImpl.callRealMethod(InvocationImpl.java:109) at org.mockito.internal.stubbing.answers.CallsRealMethods.answer(CallsRealMethods.java:41) at org.mockito.internal.stubbing.StubbedInvocationMatcher.answer(StubbedInvocationMatcher.java:34) at org.mockito.internal.handler.MockHandlerImpl.handle(MockHandlerImpl.java:91) at org.mockito.internal.handler.NullResultGuardian.handle(NullResultGuardian.java:29) at org.mockito.internal.handler.InvocationNotifierHandler.handle(InvocationNotifierHandler.java:38) at com.google.dexmaker.mockito.InvocationHandlerAdapter.invoke(InvocationHandlerAdapter.java:49) at MockNavigationDrawerActivity_Proxy.onCreate(MockNavigationDrawerActivity_Proxy.generated) 

    ¿Alguna idea de cómo probar este caso sencillo ?

    Actualización # 1

    Intenté absolutamente todo. Lo redujo al mínimo absoluto que no funciona.

     public void testUpdate1() throws Exception { try { getActivity(); fail(); } catch (Exception e) { assertThat(e.getMessage()).contains("something went wrong"); } } 

    Stacktrace:

     java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example/com.example.MyActivity}: java.lang.IllegalStateException: something went wrong at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2298) at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2360) at android.app.ActivityThread.access$800(ActivityThread.java:144) at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1278) at android.os.Handler.dispatchMessage(Handler.java:102) at android.os.Looper.loop(Looper.java:135) at android.app.ActivityThread.main(ActivityThread.java:5221) 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:899) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:694) Caused by: java.lang.IllegalStateException: something went wrong at com.example.MyActivity.onCreate(MyActivity.java:28) at android.app.Activity.performCreate(Activity.java:5933) at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1105) at android.support.test.runner.MonitoringInstrumentation.callActivityOnCreate(MonitoringInstrumentation.java:346) at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2251) ... 10 more 

    Actualización # 2

    Comencé desde el principio. Generado un nuevo proyecto, lanzó la excepción

     @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); throw new IllegalStateException("something"); } 

    Intentó cogerlo con un Throwable .

     public class MainActivityTest extends ActivityInstrumentationTestCase2<MainActivity> { public MainActivityTest() { super(MainActivity.class); } public void testOnCreate() throws Exception { try { getActivity(); fail(); } catch (Throwable throwable) { assertTrue(throwable.getCause().getMessage().contains("something")); } } } 

    Tengo este (completo) stacktrace que no conduce a mi prueba. El sistema parece llamar a onCreate , quizás de un proceso diferente, no de mi prueba.

     Process: com.pascalwelsch.onccreatetest, PID: 3915 java.lang.RuntimeException: Unable to start activity ComponentInfo{com.pascalwelsch.onccreatetest/com.pascalwelsch.onccreatetest.MainActivity}: java.lang.IllegalStateException: something at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2298) at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2360) at android.app.ActivityThread.access$800(ActivityThread.java:144) at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1278) at android.os.Handler.dispatchMessage(Handler.java:102) at android.os.Looper.loop(Looper.java:135) at android.app.ActivityThread.main(ActivityThread.java:5221) 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:899) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:694) Caused by: java.lang.IllegalStateException: something at com.pascalwelsch.onccreatetest.MainActivity.onCreate(MainActivity.java:15) at android.app.Activity.performCreate(Activity.java:5933) at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1105) at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2251)            at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2360)            at android.app.ActivityThread.access$800(ActivityThread.java:144)            at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1278)            at android.os.Handler.dispatchMessage(Handler.java:102)            at android.os.Looper.loop(Looper.java:135)            at android.app.ActivityThread.main(ActivityThread.java:5221)            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:899) 

  • Iniciar Android Market desde la aplicación
  • El evento onScroll no está activado para listview
  • Cómo eliminar el valor duplicado de arraylist en Android
  • Comparar dos imágenes en android
  • No se encontró el comando de Android incluso PATH
  • Abrir el archivo KML local en Google Maps en Android
  • 3 Solutions collect form web for “Actividad de prueba onCreate Exception”

    Usted está lanzando IllegalArgumentException y captura IllegalStateException . Usted puede agregar otro bloque de captura con la Exception captura – que funcionará.

    ¿Por qué te burlas de la clase que estás tratando de probar? Debe MyActivity dependencias de MyActivity para probar que sus métodos están utilizando correctamente los simulacros.

    Por ejemplo, si desea probar la clase A que depende de B y C , entonces desea crear 2 mokes para B y C y un objeto concreto de A Entonces usted inyecta esos 2 zombies en su objeto y usted puede comenzar a llamar métodos en él.

    Esto es probablemente también la razón por la que obtiene un java.lang.AbstractMethodError (no hay suficiente código publicado para confirmarlo). Si se llama a un método real en un simulacro, mientras que este método es abstracto (por ejemplo, se está burlando de una interfaz o una clase abstracta), entonces este error se lanza.

    A continuación he publicado algún código y una prueba como ejemplo de cómo puede insertar mocks en un objeto concreto.

    En codigo:

     class A { B b; C c; void doSomething() { b.aMethod(); c.anotherMethod(); throw new IllegalArgumentException("something went wrong"); } } interface B { void aMethod(); } abstract class C { void anotherMethod(); } 

    Con una prueba:

     @RunWith(MockitoJUnitRunner.class) class ATest { @Mock B b; @Mock C c; // The inject mocks will insert both b and c into a by using reflection @InjectMocks A a; @Test(expected=IllegalArgumentException.class) public void testSomething() { a.doSomething(); } } 

    getActivity está de hecho llamando onCreate método onCreate , por lo que está fallando con su excepción programada y lanza otro ( RuntimeException ) con su generado como causa raíz.

    FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.