2013-09-02 5 views
3

Возможно ли издеваться над классом камеры Android?Android mock Camera

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

не удастся создать макет (ExceptionInitializerError в Mockito-х createProxyClass).

Должен ли я создать какую-то обертку вокруг Camera (не мое любимое решение, действительно хотел бы просто издеваться над классом ...)?

Или, если я использую другую библиотеку, а затем Mockito?

Надеюсь, что кто-то может указать мне в правильном направлении.

Полная StackTrace из 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 
+0

Не могли бы вы разместить более подробную информацию из 'ExceptionInitializerError'? Возможно, есть еще одна подсказка. –

+0

@bas вы умеете макет камеры? – Sush

ответ

2

В вашей stacktrace обратите внимание на подстроку «.CglibMockMaker»: вот в чем проблема. CGLib не работает на android - есть плагин для Mockito специально для Android, который использует dexmaker, который похож на CGLib, но работает на dalvik. Просто найдите dexmaker mockito, и вы должны быть на правильном пути.

Вы по-прежнему не сможете издеваться над Camera.open() (статическим заводским методом), но вы можете реорганизовать свой код вокруг этого. Важно то, что камера не является окончательным классом; остальное - просто неудобная сантехника для теста, которую вы должны просто принять в качестве налога для написания хорошо протестированных приложений для Android.

+0

[Mockito offical doc] (http://docs.mockito.googlecode.com/hg/org/mockito/Mockito.html) гласит, что «Mockito не высмеивает окончательные методы». Большинство методов камеры являются окончательными. Так что, кажется, насмехающаяся камера не вариант. – lacton

1

Я думаю, что ExceptionInInitializerError исключение происходит потому, что Camera только должна быть реализовано через статический open() метод, так что какое-то статическая инициализация происходит сбой, когда Mockito пытается создать издеваться. По-видимому, это невозможно обойти. Возможно, он ожидает взаимодействия с оборудованием, которого нет в тестовой среде? Возможно, вы сможете использовать PowerMock, чтобы издеваться над ним, или вы можете просто пойти с заявленной альтернативой класса-оболочки с интерфейсом.

+0

Пробовал получить успешный тест целый день, пока не повезло. Теперь я завернул камеру, но Android JUnit отказывается выполнять тривиальный тест с mockito. Прочитайте около 100 страниц в Интернете, и он нигде не попал ... Невероятно. Дает PowerMock выстрел. – bas

+0

Плохие времена. Любая удача с PowerMock? –

+0

Я сдался на этом :). Обернул камеру так, чтобы она меня не слишком раздражала. В скором времени я попробую у власти. +1 для указателей и помощь – bas

3

Ответ задерживается, но здесь приведен пример примерной камеры для Android.

Вы можете установить VideoFileInputSource издеваться камеру из видеофайла

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

или вы можете включить аппаратную камеру для видео потока.

Здесь вы можете найти полный образец проекта. https://github.com/muneikh/MockCamera

+0

Thx для ответа в любом случае. Некоторое время назад я прекратил заниматься андроидами, поэтому я не смогу подтвердить ваш ответ. Если «сообщество» заявляет, что это действительно работает, я отмечу его как принятое, тем не менее. – bas