Robolectric+Eclipse не может найти ресурсы?
-
27-10-2019 - |
Вопрос
Я только что настроил тестовый проект для моего приложения Android для использования Robolectric. Я следовал за Eclipse Quick StartАнкет Исключение поднимается, выполняя мой простой самый первый тест.
java.lang.RuntimeException: java.lang.NullPointerException
at com.xtremelabs.robolectric.res.ResourceLoader.init(ResourceLoader.java:93)
at com.xtremelabs.robolectric.res.ResourceLoader.getStringValue(ResourceLoader.java:271)
at com.xtremelabs.robolectric.shadows.ShadowResources.getString(ShadowResources.java:56)
at android.content.res.Resources.getString(Resources.java)
at org.xxx.mobile.android.teldir.app.TelephoneDirectoryTest.searchButtonLabelShouldBeGo(TelephoneDirectoryTest.java:22)
[...]
Caused by: java.lang.NullPointerException
at com.xtremelabs.robolectric.res.StringResourceLoader.getValue(StringResourceLoader.java:17)
at com.xtremelabs.robolectric.res.StringArrayResourceLoader.processNode(StringArrayResourceLoader.java:39)
at com.xtremelabs.robolectric.res.XpathResourceXmlLoader.processResourceXml(XpathResourceXmlLoader.java:27)
at com.xtremelabs.robolectric.res.DocumentLoader.loadResourceXmlFile(DocumentLoader.java:58)
at com.xtremelabs.robolectric.res.DocumentLoader.loadResourceXmlDir(DocumentLoader.java:52)
at com.xtremelabs.robolectric.res.DocumentLoader.loadResourceXmlDir(DocumentLoader.java:39)
at com.xtremelabs.robolectric.res.ResourceLoader.loadValueResourcesFromDir(ResourceLoader.java:142)
at com.xtremelabs.robolectric.res.ResourceLoader.loadValueResourcesFromDirs(ResourceLoader.java:136)
at com.xtremelabs.robolectric.res.ResourceLoader.loadValueResources(ResourceLoader.java:109)
at com.xtremelabs.robolectric.res.ResourceLoader.init(ResourceLoader.java:85)
at com.xtremelabs.robolectric.res.ResourceLoader.getStringValue(ResourceLoader.java:271)
at com.xtremelabs.robolectric.shadows.ShadowResources.getString(ShadowResources.java:56)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at com.xtremelabs.robolectric.bytecode.ShadowWrangler.methodInvoked(ShadowWrangler.java:87)
at com.xtremelabs.robolectric.bytecode.RobolectricInternals.methodInvoked(RobolectricInternals.java:110)
at android.content.res.Resources.getString(Resources.java)
[...]
Тест следует.
import static org.junit.Assert.assertEquals;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import com.xtremelabs.robolectric.RobolectricTestRunner;
@RunWith(RobolectricTestRunner.class)
public class TelephoneDirectoryTest {
private TelephoneDirectory activity;
@Before
public void setUp() {
activity = new TelephoneDirectory();
}
@Test
public void searchButtonLabelShouldBeGo() throws Exception {
String goLabel = activity.getResources().getString(R.string.search);
assertEquals("Go", goLabel);
}
}
Кажется, он не может найти Android ./res
папка. Я указал на конфигурацию JUNIT на ${workspace_loc:teldir-android}
Как говорит гид. И это заставляет затмения найти AndroidManifest.xml
, избегая других ошибок, ИМХО.
Пытаясь избежать этого исключения, я также добавил ./res
Папка в качестве исходной папки моего приложения Android, очищенная и перезапущенная все, но одно и то же исключение поднято.
Что я делаю не так?
Решение
Мне пришлось добавить переменную среды в конфигурацию теста на прогон:
ANDROID_HOME=C:/path/to/android-sdks
Другие советы
У меня была такая же проблема (Runtimeexception при загрузке ресурсов) при первой настройке моего проекта Eclipse с помощью robolectric, но теперь он работает.
Я понял две вещи:
- Если вы получите
WARNING: Unable to find path to Android SDK
(Сообщение не может отображаться в версии ниже 1,0-RC1), тогдаResourceLoader
Не удалось найти ваш корень SDK. Один из методов ищетANDROID_HOME
переменная среды, которая должна указывать на то, где находится ваш Android SDK. - Наконец, есть ошибка что вызывает исключение, если ваше меню. XML не отформатировано определенным образом.
Использование Robolectric без Maven или Ant возможно, но может быть еще несколько ошибок. Этот Видео показывает правильную настройку проекта. Если это не сработает, получите последнюю версию от GitHub (импорт как проект Maven в Eclipse, и вам может понадобиться github.com/mosabua/maven-android-sdk-deployerи начать отладку!
Если ресурс. <array>...</array>
теги, заменить их на <string-array>...</string-array>
Используя robolectric 2.0
Читайте в: https://groups.google.com/forum/#!topic/robolectric/gqoy0bcguys
Документы: http://developer.android.com/guide/topics/resources/string-resource.html#stringarray
Это неправильно, очевидно .. Мне пришлось настроить способ сделать все, чтобы сделать что-то, так как вы не можете запустить роболктрические тесты из Eclipse, поскольку рабочее пространство Eclipse по-прежнему не распознает отдельные файлы связанных источников. Смотрите мой альфа-пример:
https://github.com/shareme/wabash
Та же самая ошибка, которую я получаю, кстати .. с ключевых направлений лабораторий ..
Только что имела эту проблему после свежей установки Windows 8. Скорее всего, Robolectric не может найти SDK. Чтобы указать на это в нужное место. Вы можете генерировать local.properties
Файл в вашем проекте Android. Это можно сделать в командной строке, перейдя в корневую папку вашего проекта и выпустив команду:
android update project –p c:\project\root\folder
Открытым local.properties
Чтобы проверить sdk.dir
указывает на ожидаемый путь.
Также убедитесь, что вы загрузили Android API уровня 8. Robolectric Поглядывает папку в /path/to/your/sdk/platforms/android-8
каталог.
Вы можете получить файл JAR в этой ссылке. Просто скачать его. Добавьте JAR в проект, и это. Я использовал в своем проекте. Любые сомнения спрашивают меня
http://www.java2s.com/code/jardownload/robolectric/robolectric-1.2-8.jar.zip