4

Android Camera クラスをモックすることは可能ですか?

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

モックの生成に失敗しました ( ExceptionInitializerErrorMockito's 内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 では動作しません。CGLib に似ていますが、dalvik で動作する dexmaker を使用する android 専用の Mockito 用プラグインがあります。dexmaker mockito を検索するだけで、正しい道を進んでいるはずです。

Camera.open() (静的ファクトリ メソッド) をモックすることはできませんが、コードをリファクタリングすることはできます。重要なのは、Camera が最終クラスではないということです。残りはテストのための厄介な配管であり、十分にテストされた Android アプリを作成するための税金として受け入れる必要があります。

于 2013-10-09T17:09:16.753 に答える
1

静的メソッドを介してのみインスタンス化されることになっているため、ExceptionInInitializerError例外が発生していると思います。そのため、Mockito がモックを作成しようとすると、ある種の静的初期化が失敗します。それを回避することはできないようです。おそらく、テスト環境に存在しないハードウェアと対話することを期待していますか? とにかくPowerMockを使用してそれをモックできる場合もあれば、インターフェースを持つラッパークラスの指定された代替手段を使用したい場合もあります。Cameraopen()

于 2013-09-02T13:55:18.147 に答える