Android mock Cámara

¿Es posible burlarse de la clase de cámara Android?

@Override public void setUp() { _camera = Mockito.mock(Camera.class); } 

falla al generar un simulacro ( ExceptionInitializerError en createProxyClass de createProxyClass ).

¿Debería crear algún tipo de envoltorio alrededor de la Camera (no es mi solución favorita, realmente me gustaría burlar la clase …)?

O, ¿debo usar una biblioteca simulada diferente entonces Mockito?

Espero que alguien me pueda señalar en la dirección correcta.

Complete stacktrace de ExceptionInitializerError

 java.lang.ExceptionInInitializerError at org.mockito.internal.creation.jmock.ClassImposterizer.createProxyClass(ClassImposterizer.java:85) at org.mockito.internal.creation.jmock.ClassImposterizer.imposterise(ClassImposterizer.java:62) at org.mockito.internal.creation.jmock.ClassImposterizer.imposterise(ClassImposterizer.java:56) at org.mockito.internal.creation.CglibMockMaker.createMock(CglibMockMaker.java:23) at org.mockito.internal.util.MockUtil.createMock(MockUtil.java:26) at org.mockito.internal.MockitoCore.mock(MockitoCore.java:51) at org.mockito.Mockito.mock(Mockito.java:1243) at org.mockito.Mockito.mock(Mockito.java:1120) at com.cleancode.lifesaver.flashlight.test.FlashLightTests.setUp(FlashLightTests.java:20) at android.test.AndroidTestRunner.runTest(AndroidTestRunner.java:190) at android.test.AndroidTestRunner.runTest(AndroidTestRunner.java:175) at android.test.InstrumentationTestRunner.onStart(InstrumentationTestRunner.java:555) at android.app.Instrumentation$InstrumentationThread.run(Instrumentation.java:1661) Caused by: java.lang.VerifyError: org/mockito/cglib/core/ReflectUtils at org.mockito.cglib.core.KeyFactory$Generator.generateClass(KeyFactory.java:167) at org.mockito.cglib.core.DefaultGeneratorStrategy.generate(DefaultGeneratorStrategy.java:25) at org.mockito.cglib.core.AbstractClassGenerator.create(AbstractClassGenerator.java:217) at org.mockito.cglib.core.KeyFactory$Generator.create(KeyFactory.java:145) at org.mockito.cglib.core.KeyFactory.create(KeyFactory.java:117) at org.mockito.cglib.core.KeyFactory.create(KeyFactory.java:109) at org.mockito.cglib.core.KeyFactory.create(KeyFactory.java:105) at org.mockito.cglib.proxy.Enhancer.<clinit>(Enhancer.java:70) ... 18 more 

En su stacktrace, observe la subcadena ".CglibMockMaker": ese es el problema aquí. CGLib no funciona en Android – hay un complemento para Mockito específicamente para Android que utiliza dexmaker, que es como CGLib pero funciona para dalvik. Sólo busca para dexmaker mockito y deberías estar en el camino correcto.

Todavía no podrá burlarse de Camera.open () (el método estático de fábrica), pero puede refactorizar su código alrededor de eso. Lo que importa es que Camera no es una clase final; el resto es sólo tubería torpe para la prueba, que sólo debe aceptar como el impuesto para la escritura de aplicaciones Android bien probado.

La respuesta es tarde, pero aquí hay un ejemplo de cámara falsa para Android.

Puede configurar VideoFileInputSource para imitar la cámara desde un archivo de vídeo

 textureVideoInputSource = new VideoFileInputSource(this, "mock_input_video.mp4"); 

o puede habilitar la cámara de hardware para la secuencia de vídeo.

 textureVideoInputSource = new CameraTextureVideoInputSource(this); 

Aquí puede encontrar el proyecto completo de la muestra. https://github.com/muneikh/MockCamera

Creo que la excepción ExceptionInInitializerError está sucediendo porque la Camera sólo se supone que se instancia a través de su método estático open() , por lo que algún tipo de inicialización estática está fallando cuando Mockito trata de crear un simulacro. No parece ser posible trabajar alrededor de eso. Tal vez espera interactuar con hardware que no está presente en un entorno de prueba? Usted puede ser capaz de utilizar PowerMock para burlarse de todos modos, o puede que sólo quieren ir con su alternativa declarada de una clase de contenedor con una interfaz.

  • NPE al llamar a MockitoAnnotations.initMocks () en AndroidTestCase
  • ¿Cómo los métodos de prueba de unidad publicados por Event Bus en android?
  • Casos de prueba de unidad con JUnit + (Robolectric o Mockito o ambos en Android)
  • Cómo burlar el método e en Log
  • Cómo burlar Contexto usando Mockito?
  • Intento de mockito de simular cualquier clase genera ExceptionInInitializerError
  • Android Tests: Stubbing Out Retrofit con Mockito
  • Junit / Mockito - esperar la ejecución del método
  • Robolectric Test no llama a textWatcher.onTextChanged
  • Prueba Unitaria de Retrofit 2 api call con Mockito
  • Cómo burlar MotionEvent y SensorEvent para la prueba de unidad en android?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.