J'ai essayé de tester mon code avec robolectric. Le problème est qu'il a des références dupliquées. par exemple
apply plugin: 'idea'
idea {
module {
downloadJavadoc = true
downloadSources = true
}
}
android {
compileSdkVersion 28
buildToolsVersion '28.0.3'
useLibrary 'org.apache.http.legacy'
useLibrary 'android.test.runner'
useLibrary 'android.test.base'
useLibrary 'android.test.mock'
defaultConfig {
applicationId "com.example.sampleapp"
minSdkVersion 16
targetSdkVersion 28
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
}
testOptions {
unitTests {
includeAndroidResources = true
}
}
}
dependencies {
androidTestImplementation 'androidx.test:rules:1.2.0'
androidTestImplementation 'androidx.test:core:1.2.1-alpha02'
androidTestImplementation 'androidx.test.espresso:espresso-core:3.2.0'
androidTestImplementation 'org.robolectric:robolectric:4.3'
// Mail-Versand
implementation 'com.sun.mail:android-mail:1.6.2'
implementation 'com.sun.mail:android-activation:1.6.2'
implementation 'androidx.appcompat:appcompat:1.0.2'//
implementation 'com.github.woxthebox:draglistview:1.6.6'
}
J'ai utilisé l'application d'artefact gradel app:dependencies pour obtenir le rapport suivant. Voici les parties importantes:
+--- org.robolectric:robolectric:4.3 | +--- org.robolectric:annotations:4.3 | +--- org.robolectric:junit:4.3 | | +--- org.robolectric:annotations:4.3 | | +--- org.robolectric:sandbox:4.3 | | | +--- org.robolectric:annotations:4.3 | | | +--- org.robolectric:utils:4.3 | | | | +--- org.robolectric:annotations:4.3 | | | | +--- org.robolectric:pluginapi:4.3 | | | | | +--- org.robolectric:annotations:4.3 | | | | | +--- org.apache.ant:ant:1.8.0 | | | | | | \--- org.apache.ant:ant-launcher:1.8.0 | | | | | \--- org.apache.maven:maven-ant-tasks:2.1.3 | | | | | +--- org.apache.ant:ant:1.8.0 (*) | | | | | +--- classworlds:classworlds:1.1-alpha-2 | | | | | +--- org.codehaus.plexus:plexus-container-default:1.0-alpha-9-stable-1 | | | | | | +--- org.codehaus.plexus:plexus-utils:1.0.4 -> 1.5.15 | | | | | | \--- classworlds:classworlds:1.1-alpha-2 | | | | | +--- org.codehaus.plexus:plexus-utils:1.5.15 | | | | | +--- org.codehaus.plexus:plexus-interpolation:1.11 | | | | | +--- org.apache.maven:maven-artifact:2.2.1 | | | | | | \--- org.codehaus.plexus:plexus-utils:1.5.15 | | | | | +--- org.apache.maven:maven-artifact-manager:2.2.1 | | | | | | +--- org.apache.maven:maven-repository-metadata:2.2.1 | | | | | | | \--- org.codehaus.plexus:plexus-utils:1.5.15 | | | | | | +--- org.codehaus.plexus:plexus-utils:1.5.15 | | | | | | +--- org.apache.maven:maven-artifact:2.2.1 (*) | | | | | | +--- org.codehaus.plexus:plexus-container-default:1.0-alpha-9-stable-1 (*) | | | | | | +--- org.apache.maven.wagon:wagon-provider-api:1.0-beta-6 | | | | | | | \--- org.codehaus.plexus:plexus-utils:1.4.2 -> 1.5.15 | | | | | | \--- backport-util-concurrent:backport-util-concurrent:3.1 | | | | | +--- org.apache.maven:maven-model:2.2.1 | | | | | | \--- org.codehaus.plexus:plexus-utils:1.5.15 | | | | | +--- org.apache.maven:maven-project:2.2.1 | | | | | | +--- org.apache.maven:maven-settings:2.2.1 | | | | | | | +--- org.apache.maven:maven-model:2.2.1 (*) | | | | | | | +--- org.codehaus.plexus:plexus-interpolation:1.11 | | | | | | | +--- org.codehaus.plexus:plexus-utils:1.5.15 | | | | | | | \--- org.codehaus.plexus:plexus-container-default:1.0-alpha-9-stable-1 (*) | | | | | | +--- org.apache.maven:maven-profile:2.2.1 | | | | | | | +--- org.apache.maven:maven-model:2.2.1 (*) | | | | | | | +--- org.codehaus.plexus:plexus-utils:1.5.15 | | | | | | | +--- org.codehaus.plexus:plexus-interpolation:1.11 | | | | | | | \--- org.codehaus.plexus:plexus-container-default:1.0-alpha-9-stable-1 (*) | | | | | | +--- org.apache.maven:maven-model:2.2.1 (*) | | | | | | +--- org.apache.maven:maven-artifact-manager:2.2.1 (*) | | | | | | +--- org.apache.maven:maven-plugin-registry:2.2.1 | | | | | | | +--- org.codehaus.plexus:plexus-utils:1.5.15 | | | | | | | \--- org.codehaus.plexus:plexus-container-default:1.0-alpha-9-stable-1 (*) | | | | | | +--- org.codehaus.plexus:plexus-interpolation:1.11 | | | | | | +--- org.codehaus.plexus:plexus-utils:1.5.15 | | | | | | +--- org.apache.maven:maven-artifact:2.2.1 (*) | | | | | | \--- org.codehaus.plexus:plexus-container-default:1.0-alpha-9-stable-1 (*) | | | | | +--- org.apache.maven:maven-error-diagnostics:2.2.1 | | | | | | \--- org.codehaus.plexus:plexus-container-default:1.0-alpha-9-stable-1 (*) | | | | | +--- org.apache.maven:maven-settings:2.2.1 (*) | | | | | +--- org.apache.maven.wagon:wagon-file:1.0-beta-6 | | | | | | \--- org.apache.maven.wagon:wagon-provider-api:1.0-beta-6 (*) | | | | | +--- org.apache.maven.wagon:wagon-http-lightweight:1.0-beta-6 | | | | | | +--- org.apache.maven.wagon:wagon-http-shared:1.0-beta-6 | | | | | | | +--- nekohtml:xercesMinimal:1.9.6.2 | | | | | | | +--- nekohtml:nekohtml:1.9.6.2 | | | | | | | \--- org.apache.maven.wagon:wagon-provider-api:1.0-beta-6 (*) | | | | | | \--- org.apache.maven.wagon:wagon-provider-api:1.0-beta-6 (*) | | | | | \--- org.apache.maven.wagon:wagon-provider-api:1.0-beta-6 (*) | | | | +--- org.robolectric:utils-reflector:4.3 | | | | | +--- org.ow2.asm:asm:7.0 | | | | | +--- org.ow2.asm:asm-commons:7.0 | | | | | | +--- org.ow2.asm:asm:7.0 | | | | | | +--- org.ow2.asm:asm-tree:7.0 | | | | | | | \--- org.ow2.asm:asm:7.0 | | | | | | \--- org.ow2.asm:asm-analysis:7.0 | | | | | | \--- org.ow2.asm:asm-tree:7.0 (*) | | | | | \--- org.ow2.asm:asm-util:7.0 | | | | | +--- org.ow2.asm:asm:7.0 | | | | | +--- org.ow2.asm:asm-tree:7.0 (*) | | | | | \--- org.ow2.asm:asm-analysis:7.0 (*) | | | | +--- com.google.auto.service:auto-service:1.0-rc4 | | | | | +--- com.google.auto:auto-common:0.8 | | | | | | \--- com.google.guava:guava:19.0 -> 27.0.1-jre | | | | | | +--- com.google.guava:failureaccess:1.0.1 | | | | | | +--- com.google.guava:listenablefuture:9999.0-empty-to-avoid-conflict-with-guava | | | | | | +--- com.google.code.findbugs:jsr305:3.0.2 | | | | | | +--- org.checkerframework:checker-qual:2.5.2 | | | | | | +--- com.google.errorprone:error_prone_annotations:2.2.0 | | | | | | +--- com.google.j2objc:j2objc-annotations:1.1 | | | | | | \--- org.codehaus.mojo:animal-sniffer-annotations:1.17 | | | | | \--- com.google.guava:guava:23.5-jre -> 27.0.1-jre (*) | | | | +--- javax.inject:javax.inject:1 | | | | \--- javax.annotation:javax.annotation-api:1.3.2 | | | +--- org.robolectric:shadowapi:4.3 | | | | \--- org.robolectric:annotations:4.3 | | | +--- org.robolectric:utils-reflector:4.3 (*) | | | +--- javax.annotation:javax.annotation-api:1.3.2 | | | +--- javax.inject:javax.inject:1 | | | +--- org.ow2.asm:asm:7.0 | | | +--- org.ow2.asm:asm-commons:7.0 (*) | | | \--- com.google.guava:guava:27.0.1-jre (*) | | +--- org.robolectric:pluginapi:4.3 (*) | | +--- org.robolectric:shadowapi:4.3 (*) | | \--- org.robolectric:utils-reflector:4.3 (*) | +--- org.robolectric:pluginapi:4.3 (*) | +--- org.robolectric:resources:4.3 | | +--- org.robolectric:utils:4.3 (*) | | +--- org.robolectric:annotations:4.3 | | +--- org.robolectric:pluginapi:4.3 (*) | | \--- com.google.guava:guava:27.0.1-jre (*) | +--- org.robolectric:sandbox:4.3 (*) | +--- org.robolectric:utils:4.3 (*) | +--- org.robolectric:utils-reflector:4.3 (*) | +--- org.robolectric:plugins-maven-dependency-resolver:4.3 | | +--- org.robolectric:pluginapi:4.3 (*) | | +--- org.robolectric:utils:4.3 (*) | | +--- org.apache.ant:ant:1.8.0 (*) | | \--- org.apache.maven:maven-ant-tasks:2.1.3 (*) | +--- javax.inject:javax.inject:1 | +--- javax.annotation:javax.annotation-api:1.3.2 | +--- org.robolectric:shadows-framework:4.3 | | +--- org.robolectric:annotations:4.3 | | +--- org.robolectric:resources:4.3 (*) | | +--- org.robolectric:pluginapi:4.3 (*) | | +--- org.robolectric:shadowapi:4.3 (*) | | +--- org.robolectric:utils:4.3 (*) | | +--- org.robolectric:utils-reflector:4.3 (*) | | +--- androidx.test:monitor:1.2.0 -> 1.3.0-alpha02 (*) | | +--- com.almworks.sqlite4java:sqlite4java:0.282 | | +--- com.ibm.icu:icu4j:53.1 | | +--- com.google.android.apps.common.testing.accessibility.framework:accessibility-test-framework:2.1 | | | +--- org.hamcrest:hamcrest-core:1.3 | | | +--- org.hamcrest:hamcrest-library:1.3 (*) | | | \--- com.google.protobuf:protobuf-java:2.6.1 | | \--- androidx.annotation:annotation:1.0.0 | +--- org.bouncycastle:bcprov-jdk15on:1.52 | \--- androidx.test:monitor:1.2.0 -> 1.3.0-alpha02 (*)
Comment résoudre l'erreur de référence? Il me semble que robolectric a la même classe dans différentes dépendances?
J'utilise le script de construction suivant: apply plugin: 'com.android.application'
java.lang.RuntimeException: java.lang.RuntimeException: Duplicate class org.apache.maven.artifact.Artifact found in modules maven-ant-tasks-2.1.3.jar (org.apache.maven:maven-ant-tasks:2.1.3) and maven-artifact-2.2.1.jar (org.apache.maven:maven-artifact:2.2.1)
Comment y remédier?
Le problème sur github est ouvert: https://github.com/robolectric/robolectric/issues/5235
4 Réponses :
Enfin, lancez le test. J'ai exclu toutes les bibliothèques avec des classes dupliquées:
testImplementation ("org.robolectric:robolectric:4.3"){
exclude group: 'org.apache.maven', module: 'maven-artifact'
exclude group: 'org.apache.maven', module: 'maven-artifact-manager'
exclude group: 'org.apache.maven', module: 'maven-model'
exclude group: 'org.apache.maven', module: 'maven-plugin-registry'
exclude group: 'org.apache.maven', module: 'maven-profile'
exclude group: 'org.apache.maven', module: 'maven-project'
exclude group: 'org.apache.maven', module: 'maven-settings'
exclude group: 'org.apache.maven', module: 'maven-error-diagnostics'
exclude group: "org.apache.maven.wagon"
}
Toutes les possibilités n'ont pas été testées mais un simple test fonctionnait déjà.
vous êtes une bouée de sauvetage @ finder2
Cela pourrait probablement être écrit de manière plus générale:
testImplementation ("org.robolectric:robolectric:4.3") {
exclude group: "org.apache.maven", name: "maven-ant-tasks"
}
ou même:
testImplementation ("org.robolectric:robolectric:4.3") {
exclude group "org.apache.maven.wagon"
exclude group "org.apache.maven"
}
car ce sont les tâches maven -ant de pluginapi , qui récupèrent les dépendances org.apache.maven .
Cela ne marche pas. Cela semble génial, mais vous excluez également avec org.apache.maven le groupe maven-ant-tasks. Cela provoque une ClassNotFoundException: org.apache.maven.artifact.ant.DependenciesTask . L'idée d'exclure tout le groupe est géniale. Je l'ai utilisé pour exclure org.apache.maven.wagon
malheureusement, dans mon cas, org.codehaus.classworld que roboelectric 4.3.1 utilisé des doublons, même si j'ai exclu d'utiliser le groupe, il affichera également ClassNotFound @ finder2
@mochadwi si vous postez une nouvelle question, en fournissant des dependencies et en me notifiant son URL, je pourrais probablement résoudre le problème. ClassNotFound ne se produit généralement que lorsque vous en ClassNotFound trop.
Pensez qu'il faut utiliser debugImplementation pour l'un des paquets (il faudrait voir lequel il s'agissait). Ce sont des dependencies pour deux applications complètement différentes; au moins sur Android.
J'ai rencontré le même problème et ce qui m'a aidé, c'est que j'avais défini la dépendance Roboelectric deux fois dans le fichier Gradle, l'un avec androidTestImplementation et l'autre avec testImplementation, donc quand j'ai supprimé le problème de la première partie résolu !!!
vous êtes aussi un homme de sauvetage @ alireza-rahmaty. Je ne sais pas pourquoi j'ai besoin d'ajouter testImplementation pour roboelectric. Cela signifie pour l'instrumentation, qui n'est pas nécessaire pour le répertoire unitTest. merci encore mec
La solution pour moi était de m'assurer que je n'avais pas besoin de Robolectric dans mes dépendances androidTestImplementation .
Une fois que j'ai corrigé cela, je n'avais aucun conflit à résoudre.