Android Robolectric Exception - PullRequest
       11

Android Robolectric Exception

1 голос
/ 02 мая 2019

У меня проблема с библиотекой Robolectric.Я пишу модульные тесты с использованием Robolectric, он работает локально, но когда я объединяю свой код, он падает на конвейере (удаленно).Я использую 'org.robolectric: robolectric: 4.0.2' Сбой, только добавив эту строку в мой тестовый класс: @RunWith(RobolectricTestRunner.class)

И исключение:

FAILEDorg.apache.tools.ant.BuildException Вызывается: org.apache.maven.artifact.resolver.MultipleArtifactsNotFoundException

Ответы [ 2 ]

1 голос
/ 16 мая 2019

У меня была та же проблема: локально работала Robolectric, но однажды она подтолкнула Дженкинса к задаче gradle для выполнения тестов.

Вы можете выполнить задачу gradle для запуска тестов с флагами -i -d, чтобы увидеть больше отладочной информации.

./gradlew -i -d test

Для меня это показало, что Дженкинс не смог загрузить зависимости Robolectric:

13:58:43  13:58:42.904 [DEBUG] [TestEventLogger] com.my.package.Test > my_test_case STANDARD_ERROR
13:58:43  13:58:42.904 [DEBUG] [TestEventLogger]     Downloading: org/robolectric/android-all/9-robolectric-4913185-2/android-all-9-robolectric-4913185-2.jar from repository sonatype at https://oss.sonatype.org/content/groups/public/

Я мог бы решить эту проблему, сказав gradle использовать наш корпоративный прокси при работе на Jenkins. Одним из способов достижения этого было бы добавить следующее в ваш gradle.properties:

systemProp.http.proxyHost=http://proxy.host
systemProp.http.proxyPort=3128
systemProp.https.proxyHost=http://proxy.host
systemProp.https.proxyPort=3128

---- РЕДАКТИРОВАТЬ ----

На самом деле я нашел более чистое решение для своего случая использования, а затем настроил прокси: Robolectric предлагает способ настройки репозитория, который он использует во время выполнения (см. http://robolectric.org/configuring/). Таким образом, я смог сказать ему использовать наш корпоративный хранилище.

android {
  testOptions {
    unitTests.all {
      systemProperty 'robolectric.dependency.repo.url', 'https://local-mirror/repo'
      systemProperty 'robolectric.dependency.repo.id', 'local'
    }
  }
}
0 голосов
/ 17 мая 2019

Как сказал @ Christian.D, Robolectric пытается загрузить зависимости из внешнего репозитория, но нам нужно, чтобы он использовал внутренний. Ниже исправление:

1) Создайте собственный RobolectricTestRunner:

public class CustomRobolectricRunner extends RobolectricTestRunner {

public CustomRobolectricRunner(Class<?> testClass) throws InitializationError {
    super(testClass);
}

static {
    RoboSettings.setMavenRepositoryId("my-nexus");
    RoboSettings.setMavenRepositoryUrl("your_custom_url");
}
}

2) Аннотируйте свой тестовый класс:

@Config(manifest = Config.NONE)
@RunWith(CustomRobolectricRunner.class)

Хорошее кодирование!

...