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.