Android模拟相机

是否可以模拟Android Camera类?

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

无法生成模拟(Mockito的createProxyClass ExceptionInitializerError )。

我应该在Camera周围创建一些包装器(不是我最喜欢的解决方案,真的很想嘲笑这个类……)?

或者,我应该使用不同的模拟库然后Mockito?

希望有人能指出我正确的方向。

完成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.(Enhancer.java:70) ... 18 more 

在你的stacktrace中,注意子串“.CglibMockMaker”:这就是问题所在。 CGLib不能在android上工作 – 有一个专门用于Android的Mockito插件,它使用dexmaker,就像CGLib一样,但是适用于dalvik。 只是搜索dexmaker mockito,你应该走在正确的道路上。

您仍然无法模拟Camera.open()(静态工厂方法),但您可以围绕它重构代码。 重要的是相机不是最后一堂课; 其余的只是测试的笨拙管道,你应该接受作为编写经过良好测试的Android应用程序的税。

答案很晚,但这是Android的模拟相机示例。

您可以将VideoFileInputSource设置为video文件中的模拟摄像机

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

或者您可以为video流启用硬件摄像头。

 textureVideoInputSource = new CameraTextureVideoInputSource(this); 

您可以在此处找到完整的示例项目。 https://github.com/muneikh/MockCamera

我认为ExceptionInInitializerErrorexception正在发生,因为Camera应该通过其静态open()方法进行实例化,因此当Mockito尝试创建模拟时,某种静态初始化会失败。 似乎不可能解决这个问题。 也许它希望与测试环境中不存在的硬件进行交互? 无论如何,你或许可以使用PowerMock进行模拟,或者你可能只想使用带有接口的包装类的声明替代方法。