【问题标题】:Android mock CameraAndroid 模拟相机
【发布时间】:2013-09-05 11:57:51
【问题描述】:

是否可以模拟 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

【问题讨论】:

  • 您能否从ExceptionInitializerError 发布更多详细信息?或许还有更进一步的线索。
  • @bas 你能模拟相机吗?

标签: java android camera mocking mockito


【解决方案1】:

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

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

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

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

textureVideoInputSource = new CameraTextureVideoInputSource(this);

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

【讨论】:

  • 谢谢你的答案。我不久前停止了我的 android 活动,所以我无法验证你的答案。如果“社区”声明这确实有效,我仍会将其标记为已接受。
  • @bas 也许现在,您可以将其视为社区接受的答案吗?比当前接受的答案多 100% 的接受度;)
【解决方案2】:

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

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

【讨论】:

  • The mockito offical doc 声明“Mockito 不会模拟最终方法”。大多数相机的方法都是最终的。所以看起来嘲笑相机不是一种选择。
【解决方案3】:

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

【讨论】:

  • 现在一整天都在尝试成功测试,但还没有运气。我现在包装了相机,但 Android JUnit 仍然拒绝使用 mockito 执行一个简单的测试。在网上阅读了大约 100 页,却一无所获……难以置信。会给 PowerMock 一个机会。
  • 糟糕的时代。 PowerMock 好运吗?
  • 我放弃了 :)。把相机包起来,这样它就不会太烦我了。不过,我会尽快尝试 powermock。为指针和帮助 +1
  • 终于花时间用 PowerMock 测试了这个,但也没有运气。测试在 javaassist/NotFoundException 上失败。不确定这是否与android相机有关(没有多大意义,因为它最终只是一个java类......)。无论如何,我现在会坚持使用包装器并继续:)。感谢您的帮助。
猜你喜欢
  • 2013-01-06
  • 1970-01-01
  • 2011-03-18
  • 2019-03-03
  • 2016-08-21
  • 1970-01-01
  • 2011-02-22
  • 2012-08-04
  • 1970-01-01
相关资源
最近更新 更多