2010-07-19 9 views
7

He estado utilizando la anotación @Required hasta ahora para asegurar DI de mis beans en una aplicación configurada de Spring.Cómo activar Spring @Autowired propiedad requerida a falso para la prueba?

Para habilitar la anotación, debe declarar un bean RequiredAnnotationBeanPostProcessor en su configuración.

En su configuración de prueba simplemente no lo declara, por lo que si no se necesitan algunos granos no es necesario que los tenga en su configuración.

Quiero cambiar a menos XML y usar la anotación @Autowired, pero por defecto es obligatorio = verdadero, lo cual está bien para la configuración del tiempo de ejecución.

Pero necesito que @Autowired sea obligatorio = falso solo para fines de prueba, mientras lo mantiene requerido para el tiempo de ejecución.

¿Es eso posible? No puedo encontrar una manera de convertir declarativamente la propiedad requerida a falso.

aplausos

Respuesta

9

Probablemente ya lo resolvió, pero este truco podría ser útil para otros.

Por lo que entender sin contexto: anotación impulsada estando presente anotaciones @Autowired no deben ser procesados ​​pero esto no es claramente el caso por lo que podría entendido algo.

Sin embargo, necesitaba una solución rápida ... Este truco algo sucio niega el valor requerido para todas las clases, haciendo que sea opcional lo que se requería antes. Si lo agregué a mi contexto de prueba resolvió mi problema, pero solo es útil si se requieren todas las autorregulaciones en sus clases de negocio.

<bean class="org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor"> 
    <property name="requiredParameterValue" value="false" /> 
</bean> 
+1

Una precisión: para que esto funcione, debe colocarse antes de ; de lo contrario, no se tendrá en cuenta. – nodje

0

Se puede utilizar la misma técnica como lo hizo con @Required - no registrar el AutowiredAnnotationBeanPostProcessor en su contexto de prueba, pero se deja en su contexto vivo.

Esto generalmente se registra al agregar <context:annotation-driven/>, en lugar de declararse manualmente.

+0

Espera un minuto, si no agrega el , la primavera no lo hace incluso detectar la anotación @Autowired, ¿verdad? Lo que me gustaría, idealmente, pero estoy seguro de que muchos se han enfrentado al problema, es que Spring cargue el , es decir, detecte las anotaciones, pero active @Autowired (obligatorio = true) a falso, para que no tenga que inyectar dependencias que se requieren en el tiempo de ejecución pero que no son útiles, o incluso que no son bienvenidas, en modo de prueba. – nodje

+0

@nodje: Es suficiente, pero no es así como funciona, me temo. – skaffman

2

me funcionó una solución que funciona para configuraciones JavaConfig

@ContextConfiguration(initializers={DisableAutowireRequireInitializer.class}) 
public class TestCase { 
    // Some tests 
} 
public class DisableAutowireRequireInitializer implements ApplicationContextInitializer<ConfigurableApplicationContext> { 

@Override 
public void initialize(ConfigurableApplicationContext applicationContext) { 

    // Register the AutowiredAnnotationBeanPostProcessor while initalizing 
    // the context so we get there before any @Autowire resolution happens 
    // We set the "requiredParameterValue" so that @Autowire fields are not 
    // required to be resolved. Very useful for a test context 
    GenericApplicationContext ctx = (GenericApplicationContext) applicationContext; 
    ctx.registerBeanDefinition(AnnotationConfigUtils.AUTOWIRED_ANNOTATION_PROCESSOR_BEAN_NAME, 
      BeanDefinitionBuilder 
       .rootBeanDefinition(AutowiredAnnotationBeanPostProcessor.class) 
       .addPropertyValue("requiredParameterValue", false) 
       .getBeanDefinition()); 

    } 

} 
Cuestiones relacionadas