font - mostrar texto en jlabel java
Perfiles de primavera y pruebas. (4)
Tengo una aplicación web donde tengo el problema típico de que requiere diferentes archivos de configuración para diferentes entornos. Algunas configuraciones se colocan en el servidor de aplicaciones como fuentes de datos JNDI, sin embargo, algunas configuraciones permanecen en los archivos de propiedades.
Por lo tanto, quiero usar la función de perfiles de primavera.
Mi problema es que no me estoy ejecutando el caso de prueba.
context.xml:
<context:property-placeholder
location="classpath:META-INF/spring/config_${spring.profiles.active}.properties"/>
Caso de prueba:
@RunWith(SpringJUnit4ClassRunner.class)
@TestExecutionListeners({
TestPreperationExecutionListener.class
})
@Transactional
@ActiveProfiles(profiles = "localtest")
@ContextConfiguration(locations = {
"classpath:context.xml" })
public class TestContext {
@Test
public void testContext(){
}
}
El problema parece ser que la variable para cargar el perfil no se resuelve:
Caused by: java.io.FileNotFoundException: class path resource [META-INF/spring/config_${spring.profiles.active}.properties] cannot be opened because it does not exist
at org.springframework.core.io.ClassPathResource.getInputStream(ClassPathResource.java:157)
at org.springframework.core.io.support.PropertiesLoaderSupport.loadProperties(PropertiesLoaderSupport.java:181)
at org.springframework.core.io.support.PropertiesLoaderSupport.mergeProperties(PropertiesLoaderSupport.java:161)
at org.springframework.context.support.PropertySourcesPlaceholderConfigurer.postProcessBeanFactory(PropertySourcesPlaceholderConfigurer.java:138)
... 31 more
El perfil actual debe configurarse con la anotación @ActiveProfile
. Como es un testcase no podré usar el web.xml
. Si es posible, me gustaría evitar las opciones de tiempo de ejecución también. La prueba debe ejecutarse como está (si es posible).
¿Cómo puedo activar adecuadamente el perfil? ¿Es posible configurar el perfil con un context.xml? ¿Puedo declarar la variable en un test-context.xml que en realidad está llamando al contexto normal?
¿Puedo recomendar hacerlo de esta manera, define tu prueba de esta manera?
@RunWith(SpringJUnit4ClassRunner.class)
@TestExecutionListeners({
TestPreperationExecutionListener.class
})
@Transactional
@ActiveProfiles(profiles = "localtest")
@ContextConfiguration
public class TestContext {
@Test
public void testContext(){
}
@Configuration
@PropertySource("classpath:/myprops.properties")
@ImportResource({"classpath:context.xml" })
public static class MyContextConfiguration{
}
}
Con el siguiente contenido en el archivo myprops.properties:
spring.profiles.active=localtest
Con esto su segundo archivo de propiedades debería resolverse:
META-INF/spring/config_${spring.profiles.active}.properties
El mejor enfoque aquí es eliminar la anotación @ActiveProfiles y hacer lo siguiente:
@RunWith(SpringJUnit4ClassRunner.class)
@TestExecutionListeners({
TestPreperationExecutionListener.class
})
@Transactional
@ContextConfiguration(locations = {
"classpath:config/test-context.xml" })
public class TestContext {
@BeforeClass
public static void setSystemProperty() {
Properties properties = System.getProperties();
properties.setProperty("spring.profiles.active", "localtest");
}
@AfterClass
public static void setSystemProperty() {
System.clearProperty("spring.profiles.active");
}
@Test
public void testContext(){
}
}
Y tu test-context.xml debería tener lo siguiente:
<context:property-placeholder
location="classpath:META-INF/spring/config_${spring.profiles.active}.properties"/>
Mirando la respuesta de Biju, encontré una solución funcional.
Creé un archivo de contexto adicional test-context.xml
:
<context:property-placeholder location="classpath:config/spring-test.properties"/>
Contiene el perfil:
spring.profiles.active=localtest
Y cargando la prueba con:
@RunWith(SpringJUnit4ClassRunner.class)
@TestExecutionListeners({
TestPreperationExecutionListener.class
})
@Transactional
@ActiveProfiles(profiles = "localtest")
@ContextConfiguration(locations = {
"classpath:config/test-context.xml" })
public class TestContext {
@Test
public void testContext(){
}
}
Esto ahorra algo de trabajo al crear múltiples casos de prueba.
public class LoginTest extends BaseTest {
@Test
public void exampleTest( ){
// Test
}
}
Se hereda de una clase de prueba base (este ejemplo es testng
lugar de jUnit
, pero ActiveProfiles
es el mismo):
@ContextConfiguration(locations = { "classpath:spring-test-config.xml" })
@ActiveProfiles(resolver = MyActiveProfileResolver.class)
public class BaseTest extends AbstractTestNGSpringContextTests { }
MyActiveProfileResolver
puede contener cualquier lógica requerida para determinar qué perfil usar:
public class MyActiveProfileResolver implements ActiveProfilesResolver {
@Override
public String[] resolve(Class<?> aClass) {
// This can contain any custom logic to determine which profiles to use
return new String[] { "exampleProfile" };
}
}
Esto establece el perfil que luego se utiliza para resolver las dependencias requeridas por la prueba.