Подтвердить что ты не робот

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

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

Ошибка

Однако при настройке моего тестового проекта приложения для использования баннеров 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)

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

Настройка моего Android Test Project

Ниже приведен скриншот моей конфигурации тестового проекта. Проект был создан с помощью Android Wizard и не имеет специальных возможностей, кроме включения банок Mockito и DexMaker (упомянутых выше) в каталог libs.

Test Project Configuration

Тест

Не обращайте внимания на содержимое теста (тест не выполняется до выполнения unit test) настройка выполняется так, как описано ниже;

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...
  }

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

4b9b3361

Ответ 1

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

Выполнение тестов на реальном устройстве не демонстрирует этого отказа.

Ответ 2

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

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.jar.

Ответ 3

Просто добавьте это в свой gradle:

androidTestCompile 'org.mockito:mockito-core:1.10.8'
androidTestCompile 'com.google.dexmaker:dexmaker-mockito:1.1'

Ответ 4

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

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

Ответ 5

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