Android模拟相机

5
能否模拟Android相机类?
@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.<clinit>(Enhancer.java:70)
... 18 more

你能否提供更多关于 ExceptionInitializerError 的细节吗?也许有一些进一步的线索。 - Chris Mantle
@bas 你能模拟相机吗? - Sush
3个回答

6
答案晚了,但是这里有一个用于Android的模拟摄像头示例。
你可以将VideoFileInputSource设置为从视频文件模拟摄像头。
textureVideoInputSource = new VideoFileInputSource(this, "mock_input_video.mp4");

或者您可以启用硬件相机以进行视频流。
textureVideoInputSource = new CameraTextureVideoInputSource(this);

你可以在这里找到完整的示例项目。 https://github.com/muneikh/MockCamera

无论如何,感谢您的回答。我一段时间前停止了我的Android活动,因此无法验证您的答案。如果“社区”表示这确实有效,我仍将将其标记为已接受。 - bas
1
@bas,也许现在你可以考虑将这个回答作为社区接受的答案了?比当前接受的答案多100%的认可度 ;) - muneikh

3
在您的堆栈跟踪中,请注意子字符串“.CglibMockMaker”:这就是问题所在。CGLib无法在Android上工作--有一个专门针对Android的Mockito插件,使用dexmaker,类似于CGLib但适用于dalvik。只需搜索dexmaker mockito即可找到正确的路径。
您仍然无法模拟Camera.open()(静态工厂方法),但可以围绕此进行代码重构。重要的是Camera不是final类;其余部分只是测试的笨拙管道,您应该接受它作为编写良好测试的Android应用程序的税收。


1

我认为 ExceptionInInitializerError 异常发生是因为只能通过它的静态 open() 方法实例化 Camera,所以当 Mockito 尝试创建一个 mock 时,某种类型的静态初始化失败了。似乎无法解决这个问题。也许它预期与测试环境中不存在的硬件进行交互?您可以尝试使用 PowerMock 进行模拟,或者您可能只想使用您声明的替代方案——具有接口的包装类。


一整天都在尝试进行成功的测试,但还没有成功。我已经包装了相机,但仍然无法使用mockito执行微不足道的测试。在网上阅读了大约100页,却毫无进展...难以置信。现在将尝试使用PowerMock。 - bas
坏消息。使用PowerMock有什么进展吗? - Chris Mantle
我放弃了 :). 包装相机,这样它就不会太烦我了。不过我很快会尝试powermock。感谢指导和帮助。 - bas
最终花时间使用PowerMock进行测试,但仍然没有成功。测试失败,出现了javaassist/NotFoundException异常。不确定这是否与Android相机有关(因为从根本上讲它只是一个Java类...)。无论如何,我现在会继续使用包装器并继续前进:)感谢您的帮助。 - bas

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接