Error: no se puede encontrar @SpringBootConfiguration al realizar @WebMvcTest para Spring Controller

6 minutos de lectura

Estoy probando mi controlador dado a continuación

@Controller
public class MasterController {

@GetMapping("https://stackoverflow.com/")
public String goLoginPage(){
    return "index";
}
}

Estoy siguiendo este Documentación de Spring para probar mi controlador. Ahora, quiero probar mi controlador simplemente instanciando la capa web y no todo el contexto de Spring como se indica en la documentación. A continuación se muestra mi código para el mismo.

@RunWith(SpringRunner.class)
@WebMvcTest
public class MasterControllerTestWithWebLayer {

@Autowired
MockMvc mockMvc;

@Autowired
MasterController masterController;


@Before
public void setUp() throws Exception {
}

@After
public void tearDown() throws Exception {
}

@Test
public void testLoginHome() throws Exception{
    mockMvc.perform(get("https://stackoverflow.com/"))
    .andExpect(status().isOk())
    .andExpect(view().name("index"));
}

}

Cuando ejecuto esta prueba me sale el error Unable to find @SpringBootConfiguration,...etc. Pero estoy confundido por qué está solicitando la configuración de Spring cuando no queremos que la instancia pero queremos usar solo la capa web. Tenga la amabilidad de indicarme la dirección correcta de lo que está sucediendo aquí. Y también cómo solucionar esto. Gracias

  • intente con este @WebMvcTest (controladores = MasterController.class). Y elimine este @Autowired MasterController masterController;

    – pvpkiran

    20 de abril de 2017 a las 9:34

  • @pvpkiran está bien, eso funcionaría, pero ¿por qué no así?

    –Meena Chaudhary

    20 de abril de 2017 a las 9:56

  • ¿Tiene alguna otra dependencia en su controlador? Por ejemplo, como una clase de servicio o algo así?

    – pvpkiran

    20 de abril de 2017 a las 9:59

  • @pvpkiran No, y adivina qué, incluso si doy el nombre del controlador en @WebMvcTest todavia no funciona?

    –Meena Chaudhary

    20 de abril de 2017 a las 10:13


  • Intente poner @SpringBootTest(classes = YourSpringBootClassName.class) encima de la clase MasterControllerTestWithWebLayer

    – Chico programador

    20 de abril de 2017 a las 10:40


Avatar de usuario de Meena Chaudhary
Meena Chaudhary

Así que aquí está la solución:

Él documentación sobre la detección de la configuración de prueba dice:

El algoritmo de búsqueda funciona desde el paquete que contiene la prueba hasta que encuentra una clase anotada @SpringBootApplication o @SpringBootConfiguration. Siempre que haya estructurado su código de manera sensata, generalmente se encuentra su configuración principal.

Entonces el @SpringBootApplication la clase debe estar más arriba en la jerarquía del paquete que la clase de prueba, por ejemplo, si la clase de prueba está en el paquete com.zerosolutions.controller después @SpringBootApplication la clase debe estar en un paquete superior a com.zerosolutions.controller paquete, es decir com.zerosolutions o com.

Problema

Pero en caso de que el @SpringBootApplication la clase está en el mismo nivel que la clase de prueba, no podrá encontrarla, es decir com.zerosolutions.general. En este caso obtendrá el siguiente error:

java.lang.IllegalStateException: no se puede encontrar una @SpringBootConfiguration, debe usar @ContextConfiguration o @SpringBootTest(classes=…) con su prueba

Solución

Si está ejecutando una prueba integrada, puede mencionar explícitamente el @SpringBootApplication clase como esta

@RunWith(SpringRunner.class)
@SpringBootTest(classes={SpringBootApp.class})

Pero si desea realizar pruebas unitarias de un controlador, no necesita iniciar todo el contexto de Spring. Más bien puedes reemplazar @SpringBootTest con @WebMvcTest(MasterController.class). Esto instanciará solo la capa web con MasterController y no todo el contexto de Primavera.

Problema

Pero el problema es que volverás a encontrarte con el error que enfrentamos antes:

java.lang.IllegalStateException: no se puede encontrar una @SpringBootConfiguration, debe usar @ContextConfiguration o @SpringBootTest(classes=…) con su prueba

Y @WebMvtTest no tiene una classes atributo como @SpringBootTest mencionar explícitamente la @SpringBootApplication clase. Así que hay dos soluciones a esto.

Solución

Primero: Mueva su clase de aplicación a un paquete más alto que la clase de prueba, es decir com.zerosolutions o com paquete.

Segundo: Menciona tu @SpringBootApplication clase explícitamente como a continuación

@RunWith(SpringRunner.class)
@WebMvcTest(MasterController.class)
@ContextConfiguration(classes={SpringBootApp.class})

Espero que eso aclare la confusión de configuración de prueba de primavera. Gracias

  • su respuesta me ayudó a resolver el problema que había pasado horas resolviendo. La clase de prueba no pudo encontrar la clase de aplicación de arranque principal aunque parecía estar en el mismo paquete pero en las carpetas principal y de prueba. una vez que señalé específicamente la clase de aplicación principal usando la anotación @SpringBootTest(classes=…) las cosas empezaron a funcionar.

    – Kishore

    17/11/2017 a las 21:25

  • Esto me ayudó. En mi caso, mi prueba fue una clase de Kotlin colocada en un archivo sin ninguna package declaración. Ocurrió debido a que se copiaron y se movieron cosas. El complemento Kotlin de Intellij nunca me advirtió sobre una clase fuera de lugar.

    – ygor

    22 de febrero de 2019 a las 17:13

  • ¡La gran respuesta bang on target también me ayudó a comprender el problema y la solución!

    – akila

    12 de junio de 2019 a las 2:23

  • Perfectamente explicado!

    – X-Human

    13 oct 2019 a las 15:30

Avatar de usuario de Tadele Ayelegn
tadele ayelegn

Si su clase Application.java (en src/main/java) se encuentra en

com.A.B

Su clase de prueba ApplicationTest.java (en src/test/java) debe estar bajo

com.A.B o com.A.B.C o com.A.B.C.D

Obtendrá este error si la clase de prueba se encuentra en los siguientes paquetes

com.A o com.A.C o com.A.D

En Spring boot LA REGLA GENERAL ES EL NOMBRE DEL PAQUETE DE LA CLASE DE PRUEBA DEBE COMENZAR CON EL NOMBRE DEL PAQUETE DE LA CLASE JAVA QUE SE VA A PROBAR

  • en mi proyecto tengo mi Application.class ubicado en src/main/java/com/company/example y mi clase de prueba ApplicationTest.java ubicado en src/test/java/com/company/example. La ejecución de pruebas (prueba mvn) aún arroja IllegalStateException. ¿Entendí mal algo de tu explicación? Pensé que Spring Boot puede encontrar la clase de aplicación automáticamente con esta configuración.

    – Otrebor

    5 de noviembre de 2018 a las 21:34

  • Sí, la clase de prueba de Spring Boot debe estar en el mismo paquete de la clase principal.

    – Akash5288

    9 dic 2018 a las 19:14

avatar de usuario de acciones
valores

Tuve el mismo error y descubrí que cuando había generado el proyecto, mi pom.xml mostraba mi groupId como com.example en lugar de con mi dominio real:
<groupId>com.example</groupId>

Corregí el pom.xml para que sea:
<groupId>com.mydomain</groupId>

A continuación, cambié la estructura del archivo de:
src/test/java/com/example a src/test/java/com/mydomain

Por último, tuve que actualizar la declaración del paquete dentro de mi
SampleProjectApplicationTest.java

archivo para que coincida con la estructura de archivo correcta. Una vez que estuvo todo en su lugar, las pruebas funcionaron bien.

No estoy seguro de cómo terminé con com.example donde el resto de mi proyecto era correcto, pero la solución fue así de simple en mi caso.

Esperemos que esto ayude a alguien.

compruebe si src/test/java tiene el mismo nombre de paquete que el paquete de clase principal. src/test/java/com/example/abc es lo mismo que src/test/java/com/example/abc

Simplemente reemplace el nombre del paquete de prueba con el nombre del paquete de la clase de aplicación principal.

Ejemplo:- package com.kotlin.dealerMainApplication este es el nombre del paquete de mi aplicación principal, así que pondré el mismo nombre en mi paquete de prueba

¡Esto funcionó para mí!

¿Ha sido útil esta solución?