在集成测试中替换ScheduledAnnotationBeanPostProcessor

时间:2014-02-20 19:28:30

标签: spring groovy spring-scheduled

所以,我有一个使用@Scheduled注释的spring应用程序来完成各种工作。在生产中,它很有效。但是,这个功能在运行spock集成测试时会给我们带来一些问题 - 一旦容器启动,我们的所有任务都会被触发,它会破坏我们的测试运行。

我正在寻找一种关闭调度功能的方法,但仍然有容器(使用@ComponentScan配置)将其作为常规的“ol bean”进行选择。

基于我到目前为止所完成的一些练习,似乎如果我可以使用no-op实现覆盖内置的ScheduledAnnotationBeanPostProcessor,我可以实现这个目标..但是当我在容器中创建这个bean时(创建)使用@Bean(“scheduledAnnotationBeanPostProcessor” - 请参阅下面的代码部分),它似乎只是添加到BeanPostProcessors列表中 - 它仍然包含原始实现。

   @Bean(name="scheduledAnnotationBeanPostProcessor")
    ScheduledAnnotationBeanPostProcessor  scheduledAnnotationBeanPostProcessor(){
        return new ScheduledAnnotationBeanPostProcessor(){
            @Override
            public Object postProcessAfterInitialization(final Object bean, String beanName){
                return bean
            }
        }


    }

所以,我想我的问题是 - 如何连接一个将取代内置BeanPostProcessor的bean?仅供参考我正在使用Spring 3.2.4,应用程序通过Spring注释100%配置。

感谢。

1 个答案:

答案 0 :(得分:1)

我的错误是我没有正确命名bean。我最终找到了这个bean的构建位置(在org.springframework.scheduling.annotation.SchedulingConfiguration中)并且我复制了它的配置。

此方法演示了正确的名称/ config:

@Bean(name=AnnotationConfigUtils.SCHEDULED_ANNOTATION_PROCESSOR_BEAN_NAME)
@Role(BeanDefinition.ROLE_INFRASTRUCTURE)
BeanPostProcessor scheduledAnnotationBeanPostProcessor(){
    return new  BeanPostProcessor(){
        @Override
        Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
            return bean
        }

        @Override
        Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
            return bean
        }
    }
}