Двойной эспрессо не работает с Robolectric

Я пытаюсь запустить Espresso (используя Double Espresso) с помощью тестирования аппаратуры и модульных тестов через Robolectric. То, что я до сих пор, в основном основано на примере deckard-gradle.

Примечание: Gradle 1.10

buildscript {
  repositories {
    mavenCentral()
  }
  dependencies {
    classpath 'com.android.tools.build:gradle:0.10.4'
    classpath 'org.robolectric.gradle:gradle-android-test-plugin:0.10.0'
  }
}

apply plugin: 'android'
apply plugin: 'android-test'

android {
  compileSdkVersion 19
  buildToolsVersion '19.0.3'

  defaultConfig {
    packageName = 'com.example.app'
    minSdkVersion 9
    targetSdkVersion 19
    versionCode 1
    versionName '1.0.0'
    testInstrumentationRunner "com.google.android.apps.common.testing.testrunner.GoogleInstrumentationTestRunner"
    proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.txt'
  }

  buildTypes {
    debug {
      debuggable = true
      runProguard = false
    }

    release {
      debuggable = false
      runProguard = true
    }
  }

  sourceSets {
    androidTest {
      setRoot('src/test')
    }
  }

  packagingOptions {
    exclude 'LICENSE.txt'
  }
}

androidTest {
  include '**/*Test.class'
  exclude '**/espresso/**/*.class'
  maxHeapSize = "2048m"
}

repositories {
  mavenCentral()
}

dependencies {
  compile 'com.android.support:support-v4:19.1.0'

  androidTestCompile('com.jakewharton.espresso:espresso:1.1-r3')
  androidTestCompile('com.jakewharton.espresso:espresso-support-v4:1.1-r3') {
    exclude group: 'com.android.support', module: 'support-v4'
  }

  androidTestCompile('junit:junit:4.11') {
    exclude module: 'hamcrest-core'
  }
  androidTestCompile('org.robolectric:robolectric:2.3') {
    exclude module: 'classworlds'
    exclude module: 'maven-artifact'
    exclude module: 'maven-artifact-manager'
    exclude module: 'maven-error-diagnostics'
    exclude module: 'maven-model'
    exclude module: 'maven-plugin-registry'
    exclude module: 'maven-profile'
    exclude module: 'maven-project'
    exclude module: 'maven-settings'
    exclude module: 'nekohtml'
    exclude module: 'plexus-container-default'
    exclude module: 'plexus-interpolation'
    exclude module: 'plexus-utils'
    exclude module: 'wagon-file'
    exclude module: 'wagon-http-lightweight'
    exclude module: 'wagon-http-shared'
    exclude module: 'wagon-provider-api'
  }
  androidTestCompile 'com.squareup:fest-android:1.0.8'
}

Моя структура каталогов выглядит следующим образом, где com.example.app.espresso должно выполняться как connectedAndroidTest и com.example.app.data как test:

src
|- debug
|- main
|- release
|- test
   |- java
      |- com
         |- example
            |- app
               |- espresso
                  |- HomeActivityTest.java
               |- data
                  |- DataTest.java
   |- resources
      |- data_input.json

Поэтому, когда я запускаю gradle clean test, я получаю ошибки, не признающие импорт Espresso в HomeActivityTest.java.

Когда я запускаю gradle clean connectedAndroidTest, я получаю ошибки, не распознающие аннотации JUnit4 в DataTest.java (FailedToCreateTests.testSuiteConstructionFailed).

Если я беру любую часть (зависимости и источники), другой работает отлично независимо, но не со всем, что включено вместе.

Примечание.. Я попытался импортировать банку Espresso локально (без двойного эспрессо), так же, как и в методе deckard- gradle, который работает, пока я не использую что-либо из библиотеки support-v4 в тесте Espresso (com.jakewharton.espresso:espresso-support-v4, похоже, решает то, что нет альтернативы для локальных банок), затем он взрывается в FailedToCreateTests.testSuiteConstructionFailed.

Кто-нибудь получил эту структуру? Есть ли способ исключить исходные пути из каждой цели?

Было бы полезно принять любые решения (полные или частичные).

Ответ 1

В конце концов, я отказался от идеи использования Double Espresso и перешел к подходу, который принимает в качестве шерифа - gradle - вручную импортирует банку Espresso (espresso, testrunner и testrunner-runtime).

Кажется, что либо Double Espresso делает больше, чем просто обертывает банку как aar и принимает их, или тот факт, что они aar вызывает проблемы. Было бы интересно узнать, почему.

Чтобы избежать локальных зависимостей, я загрузил банку Espresso в репозиторий Maven, связанный с ними (espresso зависит от testrunner-runtime, testrunner-runner зависит от testrunner) и включает все зависимые от сторонних зависимостей (Guava, Hamcrest, Dagger и т.д.) В POM. Если у вас нет размещенного репозитория Maven, вы можете использовать GitHub в качестве своего репо: fooobar.com/questions/25458/....

По общему признанию, это не лучшее решение, но оно работает.

Ответ 2

Это происходит потому, что артефакты Double Espresso распространяются как .aar файлы, а компиляционная задача, которую Robolectric генерирует для запуска тестов, не зависит от задачи, которая распаковывает файлы .aar, которые являются частью конфигурации зависимостей androidTestCompile.

Поскольку вы, как правило, не будете запускать свои тесты эспрессо как часть задачи, выполняющей ваши модульные тесты, вы можете безопасно исключить тесты эспрессо из задачи компиляции, созданной плагином Robolectric. Я делаю это, добавляя зависимость от задачи компиляции, созданной плагином Robolectric, в мой build.gradle, который затрагивает свойство source. Пример кода ниже. Обязательно поднимите имя созданной робоэлектрической компиляционной задачи ( "compileTestDebugJava" в моем примере) и ваш "исключить" для ваших тестов эспрессо по мере необходимости.

tasks.whenTaskAdded { theTask ->
    if ("compileTestDebugJava".toString().equals(theTask.name.toString())) {
        def cleanupTask = "touchUpRobolectricSourceSet"
        project.task(cleanupTask) << {
            FileTree tree = fileTree(dir: 'src/test/java')
            tree.exclude '**/espresso/**/*.java'

            theTask.source = tree
        }
        theTask.dependsOn(cleanupTask)
    }
}

Ответ 3

У меня была одна и та же проблема, по-видимому, это вина Dagger 1.2 (включенная как зависимость в двойном эспрессо Jake). Если вы включите простые библиотеки 1.1, он должен работать.

(Полная тема здесь: https://groups.google.com/forum/#!topic/robolectric/xeLrnCAsq5Q)