4

是否可以模拟 Android Camera 类?

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

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

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
4

3 回答 3

6

答案很晚,但这里有一个适用于 Android 的模拟相机示例。

您可以将 VideoFileInputSource 设置为从视频文件模拟相机

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

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

textureVideoInputSource = new CameraTextureVideoInputSource(this);

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

于 2016-07-19T10:40:33.587 回答
2

在您的堆栈跟踪中,请注意子字符串“.CglibMockMaker”:这就是问题所在。CGLib 不能在 android 上运行——有一个 Mockito 插件专门用于 android,它使用 dexmaker,它类似于 CGLib,但适用于 dalvik。只需搜索 dexmaker mockito,您就应该走在正确的道路上。

您仍然无法模拟 Camera.open() (静态工厂方法),但您可以围绕它重构代码。重要的是 Camera 不是最终类。其余的只是用于测试的尴尬管道,您应该接受它作为编写经过良好测试的 android 应用程序的税。

于 2013-10-09T17:09:16.753 回答
1

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

于 2013-09-02T13:55:18.147 回答