Android+mockitoが動かなかった

  • 21
    いいね
  • 0
    コメント
この記事は最終更新日から1年以上が経過しています。

Android で mockito を使う場合は、mockito と dexmaker の jar を libs フォルダに入れるだけで良いのですが、それだけだとどうも DI に失敗するパターンがあるようです。詳細までは追えていませんが、下記のパターンそれぞれに対処が必要でした(私の場合は両者の同時対処が必要でした…)

パターン1

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)

対処

HogeTest.java
@Override
protected void setUp() throws Exception {
    super.setUp();
    Thread.currentThread().setContextClassLoader(getClass().getClassLoader());
}

元ネタ -> http://www.jjask.com/243076/verifyerror-using-mockito-1-9-5-and-dexmaker-mockito-1-0

パターン2

java.lang.IllegalArgumentException: dexcache == null (and no default could be found; consider setting the 'dexmaker.dexcache' system property)
at com.google.dexmaker.DexMaker.generateAndLoad(DexMaker.java:359)
at com.google.dexmaker.stock.ProxyBuilder.buildProxyClass(ProxyBuilder.java:252)
at com.google.dexmaker.mockito.DexmakerMockMaker.createMock(DexmakerMockMaker.java:54)
at org.mockito.internal.util.MockUtil.createMock(MockUtil.java:26)

対処

HogeTest.java
@Override
protected void setUp() throws Exception {
    super.setUp();
    System.setProperty(
        "dexmaker.dexcache",
        getInstrumentation().getTargetContext().getCacheDir().getPath());
        // Instrumentation が取れないときは以下
        // getContext().getCacheDir().getPath());

元ネタ -> http://stackoverflow.com/questions/12267572/mockito-dexmaker-on-android