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

 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) 

  • Cómo cambiar el tamaño de la pantalla física de Android desde el terminal / shell
  • Al probar la interfaz de usuario de Android, ¿cuál es la forma correcta de esperar que la interfaz de usuario esté lista?
  • En la segunda prueba getActivity () nunca vuelve
  • MonkeyRunner: manera fácil de determinar las coordenadas para MonkeyDevice touch comando?
  • UI Automator en proyecto con minSdkVersion 9
  • Haga que Espresso espere a que WebView termine de cargar
  • Probando el proyecto de Android con jar cifras
  • IllegalArgumentException con Mockito
  • 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.