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
каталог.
Тест
Не берите в голову содержание теста (тест не пройден до выполнения модульного теста), настройка описана ниже;
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...
}
Если у кого-то есть идея, что не так, пожалуйста, отключите звук здесь.
5 ответов
Как уже упоминалось, комбинация dexmaker-android работает только на 100%, когда инструментальные тесты выполняются на реальном устройстве.
Запуск тестов на реальном устройстве не показывает эту ошибку.
Привет, у меня была такая же проблема, и я нашел эту статью действительно полезной!
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,
Просто добавьте это в ваш gradle:
androidTestCompile 'org.mockito:mockito-core:1.10.8'
androidTestCompile 'com.google.dexmaker:dexmaker-mockito:1.1'
У нас просто была такая же проблема в проекте, но наши тесты также не прошли на реальном устройстве.
Причина была отслежена тем, как 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)
Для всех, у кого все еще есть эта ошибка, проверьте, не исключили ли вы класс из зависимостей. Мы случайно исключили MockMaker.class, поэтому это стало причиной исключения.