2013-06-11 3 views
2

Это не вопрос, как я нашел решение проблемы. Просто надеюсь, что это поможет другим, кто может столкнуться с этим.Robolectric использует неверный идентификатор ресурса из библиотеки при раздувании зрения

Мы используем Robolectric для написания модульных тестов для проекта, который использует библиотеку (на самом деле несколько библиотек). Библиотеки, а также приложение используют много ресурсов.

Предположим, что рабочее пространство Eclipse содержит библиотеку проектов (с пакетом «library.package» как верхний пакет), который создает библиотеку Android и приложение проекта (с «app.package» вверху), которое использует библиотеку. проект Test - это проект Robolectric, который относится к проекту приложения.

Внезапно мы обнаружили, что очень простой тест, который проверяет существование определенного вида в действии, терпит неудачу. Например:

@Test 
public void testProgressBarInit() { 
    LoginActivity activity = Robolectric.buildActivity(LoginActivity.class).create().get(); 

    assertTrue(activity.findViewById(R.id.status_text) instanceof TextView); 

}

Проект библиотеки реализует LoginActivity и определяет соответствующие ресурсы (макет). Неудачные тесты выполняются отлично, прежде чем мы изменили структуру кода, немного устранив еще одну библиотеку.

Выполнение теста под отладчиком показало, что вызов findViewById использует правильное значение R.id.status_text, взятое из файла Application/gen/R.java. В то же время мы обнаружили, что значение текста R.id.status в приложении/gen/R.java отличается от значения в Library/gen/R.java. Кроме того, каталог Appication/gen содержит файл library.package.R.java, который содержит то же значение для status_text, что и в приложении/gen/R.java (что отличается от исходного в библиотеке/gen/R.java). Это нормальное поведение инструмента aapt, который может изменять идентификаторы ресурсов при объединении ресурсов из библиотеки и приложения.

ответ

3

После некоторых исследований мы обнаружили следующее:

  1. Robolectric идентификаторы нагрузок ресурсов, которые были определены в библиотеке дважды: один раз с использованием R.class из проекта приложения, а другие с помощью R.class из проекта библиотеки

  2. , какой класс загружается, зависит от конфигурации пути класса

  3. для запуска тестов нам нужно экспортировать проект библиотеки из проекта Application

  4. , если проект библиотеки экспортируется перед тем папке Application/GEN в конфигурации пути класса, Robolectric заменяет идентификаторы ресурсов по найденным в библиотеке/бен/классы/библиотеки/пакет/R.class

  5. если библиотека проект экспортируется после папки Application/gen, Robolectric использует правильные ресурсы, найденные в приложении/bin/library/package/R.class.

Это, безусловно, ошибка в реализации Robolectric, поскольку она не должна загружать идентификаторы ресурсов из R.class, связанные с пакетом библиотеки. Все идентификаторы распространяются на Application/gen/R.java (см. discussion here on GitHub).

Если вы столкнулись с этой или подобной проблемой с использованием ресурсов при использовании Robolectric, убедитесь, что вы экспортируете проект библиотеки после папки «Приложение/ген» в конфигурации «Путь сборки и экспорта».

Смежные вопросы