IDEA IntelliJ con Junit 4.7 "!!! JUnit versión 3.8 o posterior esperado: "

206

Cuando intento ejecutar la siguiente prueba en IntelliJ IDEA recibo el mensaje:

"!!! Se esperaba JUnit versión 3.8 o posterior:"

Cabe señalar que este es un proyecto de Android en el que estoy trabajando en IntelliJ IDEA 9.

public class GameScoreUtilTest {
    @Test
    public void testCalculateResults() throws Exception {
        final Game game = new Game();

        final Player player1 = new Player();
        {
            final PlayedHole playedHole = new PlayedHole();
            playedHole.setScore(1);
            game.getHoleScoreMap().put(player1, playedHole);
        }
        {
            final PlayedHole playedHole = new PlayedHole();
            playedHole.setScore(3);
            game.getHoleScoreMap().put(player1, playedHole);
        }
        final GameResults gameResults = GameScoreUtil.calculateResults(game);

        assertEquals(4, gameResults.getScore());
    }
}

El seguimiento de la pila completa se ve así ...

!!! JUnit version 3.8 or later expected:

java.lang.RuntimeException: Stub!
    at junit.runner.BaseTestRunner.<init>(BaseTestRunner.java:5)
    at junit.textui.TestRunner.<init>(TestRunner.java:54)
    at junit.textui.TestRunner.<init>(TestRunner.java:48)
    at junit.textui.TestRunner.<init>(TestRunner.java:41)
    at com.intellij.rt.execution.junit.JUnitStarter.junitVersionChecks(JUnitStarter.java:152)
    at com.intellij.rt.execution.junit.JUnitStarter.canWorkWithJUnitVersion(JUnitStarter.java:136)
    at com.intellij.rt.execution.junit.JUnitStarter.main(JUnitStarter.java:49)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
    at java.lang.reflect.Method.invoke(Method.java:597)
    at com.intellij.rt.execution.application.AppMain.main(AppMain.java:110)

Process finished with exit code -3
benstpierre
fuente
Intellij 9, el último parche.
benstpierre
Tengo una solución aquí stackoverflow.com/questions/29172698/…
voronnenok
Honestamente, finalmente hice el uso del complemento de Android en IntelliJ y mordí la bala y utilicé el último Android Studio. todo está bien
Kirby
En caso de que alguien más viniera aquí sin tener "Prueba" en el nombre de su clase de Prueba; deberías agregar "Prueba" hermano. Nombrar su clase "GameEngine" causaría el mismo error, puede resolverlo convirtiéndolo en "GameEngineTest". ¡Salud!
recepinanc

Respuestas:

364

Este problema ocurre porque la plataforma Android ( android.jar) ya contiene clases JUnit. IDEA test runner carga estas clases y ve que son del antiguo JUnit, mientras intenta utilizar pruebas anotadas, que es una característica del nuevo JUnit, por lo tanto, obtiene el error del corredor de prueba.

La solución es simple, abra el Project Structure| ModulesEl | Dependencies, y mueva junit-4.7.jarhacia arriba, para que aparezca antes Android 1.6 Platform en el classpath. Ahora el corredor de pruebas estará contento cuando cargue la nueva versión de JUnit.

CrazyCoder
fuente
9
Solo para que las personas se den cuenta de que esto sigue siendo un problema con las versiones posteriores de Android.
Chris.Jenkins
también resolvió el problema en maven colocando la dependencia proporcionada por Android después de las dependencias de prueba
avianey
18
Tengo un proyecto de Android Gradle que usa robolectric como se describe aquí: peterfriese.de/android-testing-with-robolectric y cuando alejo la plataforma Android del 1er en el classpath, obtengo la siguiente excepción:Class not found: "com.example.intellijgradletest.MainActivityTest"
Heath Borders
77
En IDEA 14.0.3 para cambiar el orden de las dependencias, debe usar las flechas. Arrastrar y soltar no funciona.
david.perez
44
En Android Studio, los archivos dependientes se generan automáticamente. Por lo tanto, no es posible moverse hacia arriba / abajo. ¿Hay alguna otra forma de resolver este problema?
iMDroid
35

ingrese la descripción de la imagen aquí

mi módulo es un módulo de biblioteca java, por lo que cambiar JRE a 1.8 java resolvió el problema.

O también puede hacerlo globalmente a través de Configuración del módulo> Ubicación del SDK> JDK, especificando el JDK 8 de Oracle en lugar de la copia del SDK de Android.

nutella_eater
fuente
Esto realmente funciona y también tiene sentido dado el contexto del problema.
AgentKnopf
En mi caso, necesitaba cambiar JRE para Junit en valores predeterminados
Rafael
Otra forma: edite su jdk.table.xml en ~/Library/Preferences/AndroidStudioX.X/options/jdk.table.xmlo C:\Users\Name\.AndroidStudioX.X\config\options\jdk.table.xmlen Windows. Encuentre el nodo <name value="Android API 28 Platform" />y configúrelo <annotationsPath>en <root url="jar://$USER_HOME$/Android-SDK/platforms/android-28/data/annotations.zip!/" type="simple" />. También asegúrese de que el <classPath>nodo contenga platforms/android-28/...en ambas URL de ruta de archivo. Ajuste "Android-SDK" al nombre de su carpeta.
Mr-IDE el
Esto funciona para mi! ¡Simplemente cambie de Predeterminado (Android API 28) a 1.8 (Java) y funciona!
aiueoH
8

Tuve este problema con un proyecto de varios módulos (libgdx). Un módulo es puro Java y tiene pruebas. Mi solución fue establecer "usar JRE alternativo" en "Java 1.8" en la configuración de ejecución de mis pruebas unitarias. Esto asegura que no hay android.jar en el classpath y se utiliza el corredor junit 4.x

Uwe Post
fuente
Realmente no necesitas usar 1.8. Es suficiente con elegir 1.7 que no viene con el SDK de Android.
Kingston
8

Obtuve el mismo error al crear ambos Unit Testy Android Instrument Testen Android Studio 1.4+ y comenzó a confundirse. Para evitar este error Asegúrese de que el tipo de prueba se caen bajo Android TestselRun/Debug Configurations

  1. Asegúrese de seguir las instrucciones correctamente https://developer.android.com/training/testing/unit-testing/instrumented-unit-tests.html
  2. Asegúrese de que Test Artifacten el Build Variantsse establece enAndroid Instrumentation Tests
  3. Haga clic en el menú Run>Edit Configuration
  4. Asegúrese de que su nombre de clase / método esté dentro en Android Testslugar deJUnit
  5. Si está en, JUnitsimplemente elimine la configuración y haga clic derecho en el archivo que desea probar y Runnuevamente. Luego creará la configuración en la Android Testssección y se ejecutará en el dispositivo / emulador.
CallMeLaNN
fuente
44
ESTO FUNCIONÓ PARA MÍ => Si está en JUnit, simplemente elimine la configuración y haga clic derecho en el archivo que desea probar y vuelva a ejecutar. Luego creará la configuración en la sección Pruebas de Android y se ejecutará en el dispositivo / emulador.
Devendra Vaja
Me funcionó a mi también. Ejecuté la misma prueba después de moverla de una testcarpeta a otra androidTest. Android Studio no actualizó la configuración de ejecución después de hacer esto
Daniil
5

Para Android Studio: a partir de Android Studio 1.1 Beta 4 , Google ha agregado soporte para el complemento Android Gradle 1.1.0-RC . El nuevo complemento admite pruebas unitarias a través de Android Studio con junit 4+.

Esto todavía es experimental y hay algunos pasos manuales para configurarlo.

ZahiC
fuente
Funciona, pero Android Studio todavía tiene problemas con las configuraciones de generación automática para las pruebas, por lo que cada vez que tenga que arreglar la configuración en ejecución, vuelva a seleccionar el paquete de prueba. De lo contrario, NullPointerException durante la ejecución de la prueba.
Alfishe
4

Para todos los que están leyendo esta publicación y aún tienen el mismo problema con AndroidStudio 1.0. No puede cambiar el orden de dependencia en AndroidStudio, el IDE los reescribe automáticamente. E, incluso si logra cambiar el orden modificando el archivo .iml, obtendrá una "clase no encontrada ...". Esto se debe a que la ruta de salida de prueba no se puede establecer en AndroidStudio.

En realidad, hay una solución para hacer que AndroidStudio, Junit y Robolectric trabajen juntos. Eche un vistazo a este https://github.com/JCAndKSolutions/android-unit-test y use también este complemento: https://github.com/evant/android-studio-unit-test-plugin

Funciona perfectamente para mi.

rontho
fuente
2

Tengo el mismo error cuando creo mi propio paquete junit

ingrese la descripción de la imagen aquí

Para solucionar esto, he agregado estas dos líneas en el archivo gradle de mi aplicación como se explica aquí :

dependencies {
    ...
    // Required -- JUnit 4 framework
    testCompile 'junit:junit:4.12'
    // Optional -- Mockito framework
    testCompile 'org.mockito:mockito-core:1.10.19'
}
Kevin ABRIOUX
fuente
1

Hay dos cosas que podría imaginar que sucedan

  • Si su IDE intenta iniciar una prueba de Android Junit que se ejecuta directamente en el emulador, no puede usar Junit4.
  • Si usó accidentalmente las clases junit proporcionadas desde el jar de Android, no se pueden ejecutar en un jvm normal porque solo hay clases compiladas reales para el android dalvik vm.
Janusz
fuente
1

Esto también me sucedió en Android Studio 1.1, aunque debería admitir pruebas unitarias sin un complemento.

En otras máquinas (mismo proyecto, misma versión de AS) descubrí que al ejecutar pruebas unitarias, el IDE no agrega el archivo android.jar al classpath, mientras que en mi máquina sí lo hace.

Mi mejor suposición fue que debido a la conversión que hicimos de Maven a Gradle y al pasar de intellij a AS, algunos caché de configuraciones permanecieron en algún lugar de mi máquina que hizo que android.jar se agregara al classpath.

Lo que hice fue borrar todos los cachés relacionados con Android de mi máquina (en la carpeta c: \ users \ USRE_NAME): .android .AndroidStudio .gradle .m2

Después de eso volví a abrir el proyecto y las pruebas funcionaron.

Todavía trato de entender qué salió mal, pero esto debería ser el truco por ahora.

Yossi Shmueli
fuente
1

Tuve este problema en Android Studio 1.5, porque no sabía que tenía que cambiar la configuración "Probar artefacto" en "Variantes de compilación" (esquina inferior izquierda de la ventana principal) de "Pruebas de instrumentación de Android" a "Pruebas de unidad ". Cuando lo haga, puede ver un archivo ExampleUnitTest.java en la ventana Proyecto.

ScarOnTheSky
fuente
1

Tuve el mismo problema pero por otra razón. Estaba en IntelliJ con un proyecto normal de Java Gradle (no Android) pero el JDK estaba configurado para Android SDK Project Structure(era el JDK predeterminado por algunas razones). Esto es realmente tonto, pero IntelliJ no fue lo suficientemente amable como para indicarme qué está mal, así que me quedé atrapado en eso.

Invierno
fuente
1

Así es como lo resolví:

Editar configuraciones -> Valores predeterminados -> Android JUnit -> Agregue lo siguiente al directorio de trabajo:

$ MODULE_DIR $

liminal
fuente
1

Para mí, este problema fue causado por una configuración de ejecución obsoleta / rota para las pruebas. Simplemente tuve que eliminar la configuración, luego crear una nueva y se solucionó el problema.

Eliminar la configuración de prueba anterior

impactante
fuente
0

En el proyecto de Android que tenía minifyEnabled = true, después de cambiarlo a falsetodo funcionó.

Przemo
fuente
0

Si quitas

testOptions {
    unitTests.returnDefaultValues = true
}

de tu build.gradlefuncionará

Chiara
fuente
0

Vaya a Estructura del proyecto -> Configuración de la plataforma, cambie los SDK a 1.8 resolvió mi problema.

Lin W
fuente
0

También estaba enfrentando el mismo problema, después de cambiar a build.gradle, funciona bien para mí.

cambie su versión de junit dentro de build.gradle a:

    testImplementation 'junit:junit:3.8'
Abdul Rizwan
fuente
0

Desactivar "Usar JDK incrustado" en Project Structure / SDK Location es lo que ayudó en mi caso, pero no sé exactamente cuál fue la razón por la que estaba fallando en primer lugar.

Wojciech Sadurski
fuente
0

Reemplace su android.jar en la carpeta libs con el último. Puedes descargarlo desde aquí

DB377
fuente
0

En Android Studio, Open Project Structure -> SDK Location, se puede ver JDKla ubicación, el cambio de uso "Uso incrustado JDK" que es el propietario JDKde aplicar, a continuación, cambiar de nuevo a "Uso del JDK incorporado" , que es tal vez el trabajo

CrazyLiu
fuente
0

En mi caso, el cambio JREen la Run Configurationsdosis resuelve el problema, pero cuando hago clic en el botón Ejecutar junto a la función de prueba, las JREopciones se restablecerán a los valores predeterminados.

Finalmente, similar a la respuesta de @CrazyLiu, en Project Structure - SDK Location - JDK, seleccione Embedded JDK. Porque no hay una casilla de verificación en Android Studio 3.6.

Chenhe
fuente
0

recibí el mismo mensaje

JUnit version 3.8 or later expected

por un simple error de principiante. Había usado los mismos nombres de paquete y nombres de clase en src / main y src / test para una clase (la clase HomeController en mi caso):

my-test-project
  +--pom.xml
  +--src
    +--main
      +--com
        +--example
          +--Application.java
          +--controller
            +--HomeController.java
    +--test
      +--com
        +--example
          +--ApplicationTest.java
          +--controller
            +--HomeController.java  <---- same package and class name: not good!

Con eso, la clase src / main HomeController, así como la clase src / test HomeController, tenían la misma ruta completa:

com.example.controller.HomeController.class

El resultado: cualquier prueba que dependiera de la clase HomeController ha fallado.

Cambiar el nombre del paquete y / o el nombre de la clase ha resuelto el problema. Aquí el ejemplo, cuando ambos, el nombre del paquete y el nombre de la clase cambian:

my-test-project
  +--pom.xml
  +--src
    +--main
      +--com
        +--example
          +--Application.java
          +--controller
            +--HomeController.java
    +--test
      +--com
        +--example
          +--test                       <---- added (optional)
            +--ApplicationTest.java
            +--controller
              +--HomeControllerTest.java    <---- changed

Ahora los nombres de clase completamente calificados difieren. El nombre de la clase src / main HomeController es:

com.example.controller.HomeController.class

y el nombre de clase src / test HomeHontrollerTest es:

com.example.test.controller.HomeControllerTest.class

Con los nombres de clase totalmente calificados como únicos, el problema desaparece.

Olli
fuente