Estoy escribiendo una biblioteca para proporcionar alguna funcionalidad que se comparte entre varias aplicaciones diferentes de Spring Boot con las que trabajo.
Me gustaría hacer algo similar a la configuración automática que proporcionan las muchas bibliotecas de inicio de Spring Boot que existen. Eso, o alguna otra forma declarativa simple de integrar mi biblioteca con el ApplicationContext de las aplicaciones que la usan.
He encontrado algunos recursos que explican cómo funciona la configuración automática. Puedo resolver el problema anterior.
Sin embargo, no he podido encontrar ningún buen ejemplo de cómo puedo probar como parte del conjunto de pruebas de mi biblioteca que se integra adecuadamente con una aplicación Spring Boot. Idealmente, iniciaría una aplicación Spring Boot simple escrita en la prueba de la biblioteca directamente solo por el hecho de probar, agregarle la anotación correcta y poder afirmar que los beans correctos están configurados.
Intenté crear una clase TestApplication que hace eso y escribir pruebas de integración usando la anotación SpringBootTest, pero TestApplication nunca se inició antes de que comenzara mi prueba.
¿Qué puedo hacer para iniciar una aplicación simple como esa con el único fin de probar mi biblioteca? Mis pruebas están escritas con Spock y Spock-Spring en caso de que cambien las cosas en comparación con otros marcos de prueba.
Pude hacerlo funcionar con la siguiente clase de prueba:
@SpringBootTest @ContextConfiguration(classes = TestApplication) class DummyIntegrationSpec extends Specification { @Autowired DummyService dummyService void 'dummy service should exist'() { expect: dummyService.getMessage() == DummyConfiguration.MESSAGE } } y esta clase TestApplication en src/test/groovy/com/example/project/TestApplication.groovy
@SpringBootApplication(scanBasePackages = 'com.example.project.config') @EnableAutoConfiguration class TestApplication extends SpringBootServletInitializer { @Override protected SpringApplicationBuilder configure(SpringApplicationBuilder application) { return application.sources(TestApplication) } static void main(String[] args) { SpringApplication.run(TestApplication, args) } } Los dos cambios clave que tuve que hacer para que TestApplication se iniciara y cargara el contexto correcto cuando moví mi clase TestApplication de src/main a src/test fueron:
la clase TestApplication debía agregarse a la anotación ContextConfiguration
el paquete en el que viven los archivos de configuración de Java de mi biblioteca debía agregarse al campo SpringBootApplication scanBasePackages
La configuración automática de la biblioteca sigue una estructura similar a la mencionada en el enlace proporcionado por Tom.
Su configuración automática debe seleccionarse automáticamente mientras se inicia su aplicación/prueba Spring principal y todos los beans se registrarán en su contexto. Estarán disponibles para cableado automático y seguirán sus condiciones y orden de inicio.
Como resumen, asegúrese de tener una configuración automática anotada por la clase @Configuration con un @Import que importa sus clases de configuración anotadas por @Configuration (dentro de ellas, define beans con métodos anotados con @Bean ). También asegúrese de haber creado un archivo spring.factories que incluya su clase auto-configuration y que eliminó el complemento Spring Boot Maven (para que el paquete sea correcto).
Además, asegúrese de que su proyecto auto-configuration NO esté anotado por cosas como @SpringBootApplication , @EnableAutoConfiguration , @ComponentScan u otras anotaciones de arranque de resorte que deben estar solo en los proyectos de arranque de resorte principales (debe haber uno de ellos en cada pila) .
Consulte también el siguiente artículo:
Spring Boot se basa en una gran cantidad de proyectos principales de configuración automática prefabricados. Ya debería estar familiarizado con los proyectos de inicio de Spring Boot.
Puede crear fácilmente su propio proyecto de inicio siguiendo estos sencillos pasos:
Cree algunas clases de @Configuration para definir beans predeterminados. Debe usar propiedades externas tanto como sea posible para permitir la personalización e intentar usar anotaciones auxiliares de configuración automática como @AutoConfigureBefore , @AutoConfigureAfter , @ConditionalOnBean , @ConditionalOnMissingBean , etc. Puede encontrar información más detallada sobre cada anotación en la documentación oficial Anotaciones de condición
Coloque un archivo o archivos de configuración automática que agreguen todas las clases de @Configuration .
Cree un archivo llamado spring.factories y colóquelo en src/main/resources/META-INF .
En spring.factories , establezca la propiedad org.springframework.boot.autoconfigure.EnableAutoConfiguration con valores separados por comas de sus clases @Configuration :
org.springframework.boot.autoconfigure.EnableAutoConfiguration=
com.mycorp.libx.autoconfigure.LibXAutoConfiguration,
com.mycorp.libx.autoconfigure.LibXWebAutoConfiguration Con este método, puede crear sus propias clases de configuración automática que serán seleccionadas por spring-boot. Spring-boot escanea automáticamente todas las dependencias de maven/gradle para un archivo spring.factories , si encuentra uno, agrega todas las clases @Configuration especificadas en él a su proceso de configuración automática.
Asegúrese de que su proyecto de inicio auto-configuration no contenga spring boot maven plugin porque empaquetará el proyecto como un archivo JAR ejecutable y la ruta de clase no lo cargará como se esperaba; Spring Boot no podrá encontrar su spring.factories y no carga tu configuración