VerifyError с использованием Mockito 1.9.5 и DexMaker-Mockito-1.0

Как и многие другие, я был рад услышать, что Mockito теперь работает с Android и следил за этим руководством, чтобы увидеть его своими собственными глаза. Все казалось фантастическим, и я приступил к включению фиктивного решения в свой тестовый проект Android...

Ошибка

Однако при настройке тестового проекта моего приложения для использования jar-файлов mockito-all-1.9.5, dexmaker-1.0 и 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)

Мне сообщили, что это «просто еще не совсем работает», поскольку трассировка стека подразумевает, что jar DexMaker не используется - ссылка этот ответ. Тем не менее, я подозреваю, что делаю что-то не так в отношении настройки моего проекта, поэтому я хочу извлечь из коллективной базы знаний здесь, чтобы увидеть, действительно ли это ошибка пользователя или бета-ошибка.

Настройка моего тестового проекта Android

Ниже вы найдете скриншот конфигурации моего тестового проекта. Проект был создан с помощью Android Wizard и не имеет никаких особых функций, кроме включения JAR-файлов Mockito и DexMaker (упомянутых выше) в каталоге 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...
  }

Если у кого-то есть идея, что не так, пожалуйста, отключите звук здесь.


person BrantApps    schedule 24.10.2012    source источник
comment
Согласитесь, dexmaker, похоже, не используется или вообще не используется во время выполнения. Я не Android-разработчик, но здесь определенно так.   -  person Brice    schedule 24.10.2012
comment
Спасибо @Brice - любая помощь в этом великолепна и дает мне что-то, с чем я могу вернуться к разработчикам. Я укажу им на этот вопрос и ваш комментарий и посмотрю, как мы продвинемся...   -  person BrantApps    schedule 25.10.2012
comment
Просто примечание в помощь искателям... Описанная здесь ошибка также возникает, если вы пытаетесь использовать Mockito на Android без dexmaker. В этом случае добавьте два jar-файла dexmaker в каталог libs/ и создайте путь к классам.   -  person Brian White    schedule 01.01.2014
comment
Вы решили это? У меня та же проблема stackoverflow. ком/вопросы/24967050/   -  person Llamalo_X    schedule 26.07.2014


Ответы (5)


Привет, у меня была такая же проблема, и я нашел эту статью действительно полезной!

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

Ключевой элемент информации:

Чтобы использовать Mockito на устройстве или эмуляторе, вам нужно добавить три файла .jar в каталог libs вашего тестового проекта: mockito-all-1.9.5.jar, dexmaker-1.0.jar и dexmaker-mockito-1.0. баночка.

person Shilaghae    schedule 15.09.2013
comment
Как это ответ? ОП пишет в вопросе, что он использует эти три банки. - person Stealth Rabbi; 29.01.2014

Просто добавьте это в свой градиент:

androidTestCompile 'org.mockito:mockito-core:1.10.8'
androidTestCompile 'com.google.dexmaker:dexmaker-mockito:1.1'
person user1007522    schedule 02.12.2014
comment
Кто-нибудь еще получает java.lang.IllegalArgumentException: dexcache == null при попытке сделать это? - person Nilzor; 14.12.2015

У нас только что была такая же проблема в проекте, но наши тесты также провалились на реальном устройстве.

Причина была связана с тем, как 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 (строка 121 в 1.9.5)

person Christian Melchior    schedule 09.11.2012
comment
Спасибо что подметил это! Я столкнулся с ошибкой java.lang.VerifyError при попытке смоделировать класс даже после включения jar-файлов dexmaker. Это было сделано с помощью Mockito 1.9.5. Добавление этого в метод setUp избавило от ошибки. - person Ivan; 08.08.2013

Как указано в здесь комбинация dexmaker-android< /em> работает на 100 % только тогда, когда инструментальные тесты выполняются на реальном устройстве.

Запуск тестов на реальном устройстве не показывает этот сбой.

person BrantApps    schedule 25.10.2012
comment
Делает для меня, и по крайней мере один комментатор выше. - person Andrew Mackenzie; 26.10.2013

Для всех, у кого все еще есть эта ошибка, проверьте, не исключили ли вы класс в зависимостях. Мы случайно исключили MockMaker.class, так что это стало причиной исключения.

person mapodev    schedule 17.10.2014