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
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
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
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í!
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