sec - spring form docs
Reemplace una sola clase @Configuration en cada inicio de primavera @Test (3)
En mi aplicación Spring Boot quiero anular solo una de mis clases @Configuration
con una configuración de prueba (en particular mi clase @EnableAuthorizationServer
@Configuration
), en todas mis pruebas.
Hasta ahora, después de una visión general de las funciones de prueba de arranque de primavera y las funciones de prueba de integración de primavera, no ha surgido una solución sencilla:
-
@TestConfiguration
: Es para extender, no para anular; -
@ContextConfiguration(classes=…)
y@SpringApplicationConfiguration(classes =…)
me permite anular toda la configuración, no solo la clase; - Se
@Configuration
clase interna@Configuration
dentro de un@Test
para anular la configuración predeterminada, pero no se proporciona ningún ejemplo;
¿Alguna sugerencia?
Deberías usar perfiles de arranque de primavera :
- Anote su configuración de prueba con
@Profile("test")
. - Anote su configuración de producción con
@Profile("production")
. - Establezca el perfil de producción en su archivo de propiedades:
spring.profiles.active=production
. - Establezca el perfil de prueba en su clase de prueba con
@Profile("test")
.
Por lo tanto, cuando la aplicación se inicie, usará la clase "producción" y cuando las estrellas de prueba usará la clase "prueba".
Si usa la clase @Configuration
interna / anidada, se usará en lugar de la configuración principal de su aplicación.
Hace poco tuve que crear una versión dev de nuestra aplicación, que debería ejecutarse con el perfil activo de dev
fuera de la caja sin ningún argumento de línea de comando. Lo resolví agregando esta clase como una nueva entrada, que establece el perfil activo mediante programación:
package ...;
import org.springframework.boot.SpringApplication;
import org.springframework.context.annotation.Import;
import org.springframework.core.env.ConfigurableEnvironment;
import org.springframework.core.env.StandardEnvironment;
@Import(OriginalApplication.class)
public class DevelopmentApplication {
public static void main(String[] args) {
SpringApplication application =
new SpringApplication(DevelopmentApplication.class);
ConfigurableEnvironment environment = new StandardEnvironment();
environment.setActiveProfiles("dev");
application.setEnvironment(environment);
application.run(args);
}
}
Ver el Ejemplo de Perfiles de Arranque de Primavera por Arvind Rai para más detalles
Configuración de prueba interna
Ejemplo de una configuración @ interna para su prueba:
@RunWith(SpringRunner.class)
@SpringBootTest
public class SomeTest {
@Configuration
static class ContextConfiguration {
@Bean
@Primary //may omit this if this is the only SomeBean defined/visible
public SomeBean someBean () {
return new SomeBean();
}
}
@Autowired
private SomeBean someBean;
@Test
public void testMethod() {
// test
}
}
Configuración de prueba reutilizable
Si desea reutilizar la configuración de prueba para varias pruebas, puede definir una clase de configuración independiente con un perfil de perfil de Spring @Profile("test")
. Luego, @ActiveProfiles("test")
que su clase de prueba active el perfil con @ActiveProfiles("test")
. Ver código completo:
@RunWith(SpringRunner.class)
@SpringBootTests
@ActiveProfiles("test")
public class SomeTest {
@Autowired
private SomeBean someBean;
@Test
public void testMethod() {
// test
}
}
@Configuration
@Profile("test")
public class TestConfiguration {
@Bean
@Primary //may omit this if this is the only SomeBean defined/visible
public SomeBean someBean() {
return new SomeBean();
}
}
@Primario
La anotación @Primary
en la definición de bean es asegurar que esta tendrá prioridad si se encuentran más de una.