Вопрос

Я только что настроил тестовый проект для моего приложения 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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top