web-dev-qa-db-fra.com

java.lang.Exception: la classe de coureur personnalisée AndroidJUnit4 doit avoir un constructeur public avec la signature AndroidJUnit4 (Class testClass)

le grade ressemble à: 

apply plugin: 'com.Android.application'

Android {
    compileSdkVersion 25
    buildToolsVersion "25.0.2"

    defaultConfig {
        applicationId "com.google.developer.taskmaker"
        minSdkVersion 19
        targetSdkVersion 25
        versionCode 1
        versionName "1.0"

        testInstrumentationRunner "Android.support.test.runner.AndroidJUnitRunner"
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-Android.txt'), 'proguard-rules.pro'
        }
    }
}

configurations.all {
    resolutionStrategy {
        force 'com.Android.support:support-annotations:25.2.0'
    }
}


dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    testCompile 'junit:junit:4.12'
    compile 'com.Android.support:appcompat-v7:25.2.0'
    compile 'com.Android.support:recyclerview-v7:25.2.0'
    compile 'com.Android.support:design:25.2.0'
    compile 'com.Android.support:preference-v7:25.2.0'
    debugCompile 'im.dino:dbinspector:3.4.1@aar'
    // Android JUnit Runner
    compile 'com.google.Android.gms:play-services-appindexing:8.4.0'
    // Android runner and rules support

    // add this for intent mocking support
    androidTestCompile 'com.Android.support.test.espresso:espresso-intents:2.2.2'

    // add this for webview testing support
    androidTestCompile 'com.Android.support.test.espresso:espresso-web:2.2.2'
    compile 'com.Android.support.test:runner:0.5'
    compile 'com.Android.support.test:rules:0.5'
    compile 'com.Android.support.test.espresso:espresso-core:2.2.2'
}

Le cas de test unitaire ressemble à

@RunWith(AndroidJUnit4.class)
public class TestClass {

    @Rule
    public ActivityTestRule<MainActivity> mActivityRule =
            new ActivityTestRule<>(MainActivity.class);

    @Test
    public void buttonClick(){
        onView(withId(R.id.fab)).perform(click()).check(matches(isDisplayed()));
    }

}

Le message d'erreur ressemble à:

Java.lang.Exception: Custom runner class AndroidJUnit4 should have a public constructor with signature AndroidJUnit4(Class testClass)

    at org.junit.runners.model.InitializationError.<init>(InitializationError.Java:38)
    at org.junit.internal.builders.AnnotatedBuilder.buildRunner(AnnotatedBuilder.Java:111)
    at org.junit.internal.builders.AnnotatedBuilder.runnerForClass(AnnotatedBuilder.Java:86)
    at org.junit.runners.model.RunnerBuilder.safeRunnerForClass(RunnerBuilder.Java:59)
    at org.junit.internal.builders.AllDefaultPossibilitiesBuilder.runnerForClass(AllDefaultPossibilitiesBuilder.Java:26)
    at org.junit.runners.model.RunnerBuilder.safeRunnerForClass(RunnerBuilder.Java:59)
    at org.junit.runners.model.RunnerBuilder.runners(RunnerBuilder.Java:101)
    at org.junit.runners.model.RunnerBuilder.runners(RunnerBuilder.Java:87)
    at com.intellij.junit4.JUnit46ClassesRequestBuilder.collectWrappedRunners(JUnit46ClassesRequestBuilder.Java:90)
    at com.intellij.junit4.JUnit46ClassesRequestBuilder.getClassesRequest(JUnit46ClassesRequestBuilder.Java:51)
    at com.intellij.junit4.JUnit4TestRunnerUtil.buildRequest(JUnit4TestRunnerUtil.Java:91)
    at com.intellij.junit4.JUnit4IdeaTestRunner.startRunnerWithArgs(JUnit4IdeaTestRunner.Java:95)
    at com.intellij.junit4.JUnit4IdeaTestRunner.startRunnerWithArgs(JUnit4IdeaTestRunner.Java:42)
    at com.intellij.rt.execution.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.Java:234)
    at com.intellij.rt.execution.junit.JUnitStarter.main(JUnitStarter.Java:74)
    at Sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at Sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.Java:62)
    at Sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.Java:43)
    at Java.lang.reflect.Method.invoke(Method.Java:497)
    at com.intellij.rt.execution.application.AppMain.main(AppMain.Java:144)


Process finished with exit code -1

J'ai déjà vérifié d'autres réponses mais je n'ai pas trouvé de solution.Veuillez dire où les choses se passent mal. Lors de l'exécution de ce code, j'obtiens une erreur 

21
Aman Srii

Cause 1: placer les tests dans le mauvais dossier

Cette erreur peut être répliquée en créant une nouvelle application avec le modèle par défaut dans Android Studio et en copiant la ExampleInstrumentedTest générée automatiquement du dossier androidTest dans le dossier test:

 incorrectly copying an instrumented test into the test folder

Voici à quoi ressemble l'erreur:

 the OPs error Java.lang.Exception: Custom runner class AndroidJUnit4 should have a public constructor with signature AndroidJUnit4(Class testClass)

Notez que pour répliquer le problème, vous devez également ajouter de manière incorrecte des dépendances au build.gradle au niveau du module:

 dependencies in the wrong place

Cause 2: mauvaise configuration de test

Les tests unitaires locaux et les tests instrumentés ont différentes configurations d'exécution. Si vous cliquez sur Editer les configurations comme ci-dessous:

 test configuration

Vous devriez voir vos tests instrumentés sous Android Instrumented Tests et vos tests unitaires locaux sous le Android JUnit comme dans les illustrations ci-dessous:

Pour les tests instrumentés Android, la configuration devrait ressembler à ce qui suit:

 test config for Android Instrumented tests

Pour Android JUnit:

 test config for Android JUnit tests

Lorsque vous exécutez un test, Android Studio crée une configuration d'exécution pour vous. Si la configuration d'exécution est dans la mauvaise catégorie, vérifiez que vos dossiers test et androidTest sont corrects, puis vous pouvez supprimer la configuration d'exécution du Edit configurations et relancer le test. Si vous avez configuré correctement, Android Studio utilisera le type de configuration d’exécution correct cette fois-ci.

Explication

Il existe deux types de tests sous Android:

  1. Tests instrumentés
  2. Tests unitaires locaux

Tests instrumentés

Les tests instrumentés sont des tests conçus pour s'exécuter sur un combine ou émulateur. Ce sont des tests pour lesquels vous devez accéder à une partie entièrement fonctionnelle de la bibliothèque Android (comme un vrai Context par exemple). Ceux-ci doivent être placés dans le dossier androidTest et les dépendances pour ces tests (par exemple, Espresso, com.Android.support.test.rules:0.5) seront précédées de androidTestCompile dans votre build.gradle.

Voici un exemple de test instrumenté:

import Android.content.Context;
import Android.support.test.InstrumentationRegistry;
import Android.support.test.runner.AndroidJUnit4;

import org.junit.Test;
import org.junit.runner.RunWith;

import static org.junit.Assert.assertEquals;

/**
 * Instrumentation test, which will execute on an Android device.
 *
 * @see <a href="http://d.Android.com/tools/testing">Testing documentation</a>
 */
@RunWith(AndroidJUnit4.class)
public class ExampleInstrumentedTest {
    @Test
    public void useAppContext() throws Exception {
        // Context of the app under test.
        Context appContext = InstrumentationRegistry.getTargetContext();

        assertEquals("com.gyaltsab.myapplication", appContext.getPackageName());
    }
}

Tests unitaires locaux

Les tests unitaires locaux sont des tests que vous pouvez exécuter dans votre IDE. Ils ne dépendent normalement pas d’une partie de la bibliothèque Android non disponible sur une machine virtuelle standard (par exemple, ils ne dépendent pas de Context). Les dépendances pour celles-ci vont dans la partie testCompile de votre build.gradle.

Voici un exemple de test unitaire:

import org.junit.Test;

import static org.junit.Assert.*;

/**
 * Example local unit test, which will execute on the development machine (Host).
 *
 * @see <a href="http://d.Android.com/tools/testing">Testing documentation</a>
 */
public class ExampleUnitTest {
    @Test
    public void addition_isCorrect() throws Exception {
        assertEquals(4, 2 + 2);
    }
}

Notez que les tests d'unités locales n'ont pas besoin de l'annotation @RunWith(AndroidJUnit4.class) dans la déclaration de classe. Veuillez consulter la documentation officielle pour une explication plus complète.

32
David Rawson

J'ai eu le même problème. Je travaille dans le studio Android 2.3.1. J'ai vérifié mes configurations d'exécution. Sous Exécuter -> Modifier les configurations, j'ai découvert que le test que j'essayais d'exécuter en tant que test instrumenté se trouvait dans la catégorie des tests Android JUnit, même si je l'avais dans le répertoire androidTest de mon projet. J'ai ajouté un test instrumenté Android (appuyez sur le bouton plus dans le coin) et je l'ai configuré pour pointer sur le test que j'essayais de réaliser. Cela a réglé le problème pour moi.

7
no1isnothing

Essayez de déplacer votre fichier de test dans le dossier androidTest.

3
Macario Polo

Dans mon cas, le problème a été résolu en mettant la ligne ci-dessous:

@RunWith(AndroidJUnit4ClassRunner.class)
1
100RaBH

solution: - vous devez modifier le dossier de test de test en androidTest et modifier la configuration de test (ou déplacer le fichier de test de test en androidTest modifier la configuration de test)

J'ai trouvé la solution dans cette vidéo: https://youtu.be/TGU0B4qRlHY?t=9m36s

et ici: - https://stackoverflow.com/a/30172064/5723125

1
Mohamed harmoush