19

他の多くの人と同じように、MockitoがAndroidで動作するようになったと聞いて興奮し、このチュートリアルに従って自分の目でそれを確認しました。すべてがファンの羽ばたきのようで、Androidテストプロジェクトにモックソリューションを組み込んでいます...

エラー

mockito-all-1.9.5ただし、dexmaker-1.0とjarを活用するようにアプリケーションのテストプロジェクトを設定するdexmaker-mockito-1.0と、最初のテストケースで問題が発生しました。まさにこの問題は実際に。私が支援を求めているのは、

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)

スタックトレースはDexMakerjarが使用されていないことを示しているため、これは「まだ完全には機能しない」と通知されています。この応答を参照してください。ただし、プロジェクトの設定に関して何か問題があるのではないかと疑っています。そのため、ここにある集合的なナレッジベースから、これが実際にユーザーエラーなのかベータバグなのかを確認したいと考えています。

私のAndroidテストプロジェクトのセットアップ

テストプロジェクトの構成のスクリーンショットを以下に示します。プロジェクトはAndroidウィザードを介して作成され、ディレクトリの下にMockitoおよびDexMaker jar(上記)が含まれていること以外の特別な機能は共有していませんlibs

プロジェクト構成のテスト

テスト

テストの内容(単体テストが実行される前にテストが失敗する)を気にしないでください。セットアップは以下のとおりです。

public class TestSpotRatingCalculator extends InstrumentationTestCase {
  @Mock
  private AService aService; // Changed the service names being used here - not important.
  @Mock
  private BService bService;
  @Mock
  private CService cService;
  @Mock
  private DService dService;

  /**
   * @see android.test.AndroidTestCase#setUp()
   */
  @Override
  protected void setUp() throws Exception {
    super.setUp();
    MockitoAnnotations.initMocks(this);  // Failure here with aforementioned stacktrace...
  }

誰かが何が悪いのか考えているなら、ここで音を立ててください。

4

5 に答える 5

12

こんにちは私は同じ問題を抱えていました、そして私はこの記事が本当に役に立ちました!

http://corner.squareup.com/2012/10/mockito-android.html

重要な情報は次のとおりです。

デバイスまたはエミュレーターでMockitoを使用するには、テストプロジェクトのlibsディレクトリに3つの.jarファイル(mockito-all-1.9.5.jardexmaker-1.0.jar、およびdexmaker-mockito-1.0.jar )を追加する必要があります。 。

于 2013-09-15T15:54:19.817 に答える
9

これをgradleに追加するだけです:

androidTestCompile 'org.mockito:mockito-core:1.10.8'
androidTestCompile 'com.google.dexmaker:dexmaker-mockito:1.1'
于 2014-12-02T10:00:44.873 に答える
5

プロジェクトでも同じ問題が発生しましたが、実際のデバイスでもテストが失敗しました。

原因は、Mockitoがクラスローダーをどのように使用しているかを追跡し、LogCatで次のエラーが発生しました。

W/ActivityThread(5777): ClassLoader.getResources: The class loader returned by Thread.getContextClassLoader() may fail for processes that host multiple applications. You should explicitly specify a context class loader. For example: Thread.setContextClassLoader(getClass().getClassLoader());

修正は、mock()をテストする前に、クラスローダーを明示的に設定することでした。

@Override
protected void setUp() throws Exception {
    super.setUp();
    Thread.currentThread().setContextClassLoader(getClass().getClassLoader());
    fooImpl = mock(Foo.class)
}

Mockitoの問題のあるファイルは次のとおりです:org.mockito.internal.configuration.ClassPathLoader(1.9.5の121行目)

于 2012-11-09T07:07:33.573 に答える
2

ここで示唆されているように、dexmaker-androidコンボは、インストルメント化されたテストが実際のデバイスに対して実行された場合にのみ100%機能します。

実際のデバイスに対してテストを実行しても、この失敗は発生しません。

于 2012-10-25T10:14:38.773 に答える
1

まだこのエラーが発生しているすべての人について、依存関係のクラスを除外していないかどうかを確認してください。誤ってMockMaker.classを除外したため、これが例外の原因でした。

于 2014-10-17T15:16:34.313 に答える