Problema de compilación de Maven 3 y JUnit 4: el paquete org.junit no existe

80

Estoy tratando de construir un proyecto Java simple con Maven. En mi archivo pom declaro JUnit 4.8.2 como la única dependencia. Aún así, Maven insiste en usar JUnit versión 3.8.1. ¿Cómo lo soluciono?

El problema se manifiesta en un error de compilación: "el paquete org.junit no existe". Esto se debe a la declaración de importación en mi código fuente. El nombre correcto del paquete en JUnit 4. * es org.junit. * Mientras que en la versión 3. * es junit.framework. *

Creo que he encontrado documentación sobre la raíz del problema en http://maven.apache.org/plugins/maven-surefire-plugin/examples/junit.html pero el consejo parece estar destinado a los expertos de Maven. No entendí qué hacer.

Son husby
fuente
21
No he trabajado con Maven 3, pero mi primera suposición sería que su clase de prueba está en src / main / java y su POM define junit como una dependencia de prueba (es decir, el valor del elemento "alcance" es "prueba "). Sin embargo, no puedo decirlo con certeza sin ver su POM y conocer la estructura de su proyecto.
Sarah Roberts
2
Maven no insiste en JUnit en que uno debe ser usted ... parece que no ubicó sus clases de prueba en la ubicación correcta src / test / java ... y, por supuesto, el pom sería extremadamente útil.
khmarbaise

Respuestas:

52

Solo para tener una respuesta con la solución completa para ayudar a los visitantes:

Todo lo que necesita hacer es agregar la dependencia junit a pom.xml. No olvides el<scope>test</scope>

<dependency>
  <groupId>junit</groupId>
  <artifactId>junit</artifactId>
  <version>4.11</version>
  <scope>test</scope>
</dependency>
Renato Lochetti
fuente
1
Sí, la versión de tu junit es importante. Lo actualicé de 3.8.1 a 4.11 y resolvió mi problema.
Mahsa2
lo cambió de 3.11 a 4.11 y también funciona, pero me pregunto cómo sucedió eso para la versión anterior junit.
Tiina
45

@Dennis Roberts: Tenías toda la razón: mi clase de prueba estaba ubicada en src / main / java. También el valor del elemento "alcance" en el POM para JUnit era "prueba", aunque así es como se supone que debe ser. El problema fue que había sido descuidado al crear la clase de prueba en Eclipse, lo que resultó en que se creara en src / main / java en lugar de src / test / java. Esto se hizo más fácil de ver en la vista Explorador de proyectos de Eclipse después de ejecutar "mvn eclipse: eclipse", pero su comentario fue lo que me hizo verlo primero. Gracias.

Son husby
fuente
Moví algunos archivos de prueba a principal y mi junit Assert comenzó a arrojar un error. Eliminar la <scope> prueba </scope> resolvió el problema. ¡Gracias!
pMan
Moví un archivo de prueba de principal a prueba. Luego, maven compila correctamente con junit <scope> test </scope>. Muchas gracias
eleforest
Increíble, tuve el mismo problema. Y como a Jenkins no le importaba mi prueba en src / main, ni siquiera me di cuenta.
Pieter De Bie
19

mi problema era una línea dentro de mi pom.xmltenía la línea que <sourceDirectory>${basedir}/src</sourceDirectory>quitaba esta línea hizo que maven usara carpetas de estructura regular que resuelven mi problema

roble
fuente
1
Está funcionando para mí después de eliminar <sourceDirectory> src <<sourceDirectory> está funcionando
prashant thakre
12

eliminar la etiqueta de alcance en pom.xml para junit funcionó.

Manishankar Parameswaran
fuente
4
Esta solución es mala, porque ahora está enviando sus clases de prueba junit a su binario prod.
avgvstvs
4

Yo tuve el mismo problema. Todo lo que hice fue: del archivo pom.xml eliminé la dependencia para junit 3.8 y agregué una nueva dependencia para junit 4.8. Luego hice maven clean y maven install. Hizo el truco. Para verificar, después de la instalación de maven, fui proyecto-> propiedades-ruta de construcción-> dependencias de maven y vi que ahora el jar junit 3.8 se ha ido, en su lugar aparece junit 4.8 jar. ¡¡frio!!. Ahora mi prueba funciona como un encanto .. Espero que esto ayude de alguna manera ..

Steer360
fuente
Sí, pero la respuesta de @ FrVaBe hace que cuando su colega obtenga su código (y su pom.xml), él / ella no tenga que descubrir su solución de nuevo. Simplemente funcionará correctamente.
Russ Bateman
4

Mi caso fue un simple descuido.

Puse la declaración de dependencia JUnit dentro <dependencies>del <dependencyManagement/>nodo en lugar de <project/>en el archivo POM. La forma correcta es:

<project>
<!-- Other elements -->
    <dependencies>
    <!-- Other dependencies-->
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.11</version>
        </dependency>
    </dependencies>
<project>
Halcón Blanco
fuente
4

¿Cómo declaraste la versión?

<version>4.8.2</version>

Tenga en cuenta el significado de esta declaración que se explica aquí (ver NOTAS) :

Al declarar una versión "normal" como 3.8.2 para Junit, internamente esto se representa como "permitir cualquier cosa, pero preferir 3.8.2". Esto significa que cuando se detecta un conflicto, Maven puede usar los algoritmos de conflicto para elegir la mejor versión. Si especifica [3.8.2], significa que solo se utilizará 3.8.2 y nada más.

Para forzar el uso de la versión 4.8.2 intente

<version>[4.8.2]</version>

Como no tiene otras dependencias en su proyecto, no debería haber ningún conflicto que cause su problema. La primera declaración debería funcionar para usted si puede obtener esta versión de un repositorio. ¿Hereda dependencias de un pom padre?

FrVaBe
fuente
1
¿No <version>[4.8.2,)</version>sería mejor forzar al menos esa versión?
Joachim Sauer
3
@Joachim Sauer El uso de rangos de versiones actualmente también resuelve las versiones SNAPSHOT ( enlace ), y es muy controvertido discutir si ese es un buen concepto. Si no le importa obtener una versión SNAPSHOT, su sugerencia es bastante útil.
Viernes
3

Tenía mis archivos en los lugares correctos, y simplemente eliminar <scope>test</scope>de la entrada de dependencia JUnit resolvió el problema (estoy usando JUnit 4.12). Creo que con el testalcance, la dependencia simplemente se ignoraba durante la fase de compilación. Ahora todo está funcionando incluso cuando llamo mvn test.

mljrg
fuente
3

Tuve un problema bastante similar en un proyecto "test-utils" (agregando características, reglas y aserciones a JUnit) hijo de un proyecto principal que inyecta dependencias. La clase que depende del paquete org.junit.rules estaba en src / main / java.

Entonces agregué una dependencia en junit sin alcance de prueba y resolvió el problema:

pom.xml del proyecto test-util:

<dependency>
  <groupId>junit</groupId>
  <artifactId>junit</artifactId>
</dependency>

pom.xml del proyecto principal:

<dependency>
  <groupId>junit</groupId>
  <artifactId>junit</artifactId>
  <scope>test</scope>
</dependency>
Bludwarf
fuente
1

Tuve un problema similar de Eclipse compilando mi código bien, pero Maven falló al compilar las pruebas cada vez a pesar de que JUnit estaba en mi lista de dependencias y las pruebas estaban en / src / test / java /.

En mi caso, tenía la versión incorrecta de JUnit en mi lista de dependencias. Escribí pruebas JUnit4 (con anotaciones) pero tenía JUnit 3.8.x como mi dependencia. Entre la versión 3.8.xy 4 de JUnit, cambiaron el nombre del paquete de junit.framework a org.junit, razón por la cual Maven todavía rompe la compilación usando un jar JUnit.

Todavía no estoy del todo seguro de por qué Eclipse se compiló correctamente. Debe tener su propia copia de JUnit4 en algún lugar de la ruta de clases. Espero que esta solución alternativa sea útil para las personas. Llegué a esta solución después de seguir el enlace de Arthur anterior.

Briones
fuente
1

También me encontré con este problema: estaba tratando de extraer un objeto de una fuente y estaba funcionando en el código de prueba pero no en el código src. Para realizar más pruebas, copié un bloque de código de la prueba y lo solté en el código src, luego eliminé inmediatamente las líneas JUnit para saber cómo la prueba estaba tirando del objeto. Entonces, de repente, mi código no se compilaba.
El problema fue que cuando introduje el código, Eclipse resolvió amablemente todas las clases, por lo que tuve llamadas JUnit provenientes de mi código src, lo cual no era correcto. Debería haber notado las advertencias en la parte superior sobre las importaciones no utilizadas, pero no las vi.
Una vez que eliminé las importaciones JUnit no utilizadas en mi archivo src, todo funcionó a la perfección.

LConrad
fuente
1

Yo también tuve el mismo problema que se muestra a continuación.

ingrese la descripción de la imagen aquí

Para resolver el problema, las siguientes líneas se agregan a la dependenciessección en el nivel de aplicación build.gradle.

compile 'junit:junit:4.12'
androidTestCompile 'com.android.support.test:runner:0.5'

Luego, la compilación de Gradle informó la siguiente advertencia.

Warning:Conflict with dependency 'com.android.support:support-annotations'. 
Resolved versions for app (25.1.0) and test app (23.1.1) differ. 
See http://g.co/androidstudio/app-test-app-conflict for details.

Para resolver esta advertencia, se agrega la siguiente sección al nivel de aplicación build.gradle.

configurations.all {
    resolutionStrategy {
        force 'com.android.support:support-annotations:23.1.1'
    }
}
MNS
fuente
0

Encuentre la única solución para este error si tiene código en src / main / java Utils

<dependency>
<groupId>org.assertj</groupId>
<artifactId>assertj-core</artifactId>
<version>3.9.1</version>
</dependency>
hemraj chouhan
fuente
0

Cambiar la versión junit solucionó esto para mí. Parece que la versión 3.8.1 no funcionó en mi caso. Problema solucionado al cambiarlo a 4.12

Vamsi Vegesna
fuente
-1

De forma predeterminada, maven busca en estas carpetas las clases de java y de prueba respectivamente: src / main / java y src / test / java

Cuando se especifica src con las clases de prueba en fuente y el alcance de la dependencia de junit en pom.xml se menciona como prueba, maven no encontrará org.unit.

abhimanyu.varma
fuente