在 Spring 测试中禁用 @EnableScheduling

新手上路,请多包涵

当我运行我的单元测试时,它会调用我的计划任务。我想防止这种行为,这是由于我在主应用程序配置中有 @EnableScheduling 引起的。

如何在我的单元测试中禁用它?

我遇到了这个建议设置配置文件的 问题/答案

不确定我会怎么做?还是矫枉过正?我正在考虑为我的单元测试使用一个单独的 AppConfiguration,但是当我这样做时感觉就像我重复了两次代码?

 @Configuration
@EnableJpaRepositories(AppConfiguration.DAO_PACKAGE)
@EnableTransactionManagement
@EnableScheduling
@ComponentScan({AppConfiguration.SERVICE_PACKAGE,
                AppConfiguration.DAO_PACKAGE,
                AppConfiguration.CLIENT_PACKAGE,
                AppConfiguration.SCHEDULE_PACKAGE})
public class AppConfiguration {

    static final    String MAIN_PACKAGE             = "com.etc.app-name";
    static final    String DAO_PACKAGE              = "com.etc.app-name.dao";
    private static  final  String ENTITIES_PACKAGE  = "com.etc.app-name.entity";
    static final    String SERVICE_PACKAGE          = "com.etc.app-name.service";
    static final    String CLIENT_PACKAGE           = "com.etc.app-name.client";
    static final    String SCHEDULE_PACKAGE         = "com.etc.app-name.scheduling";

    @Bean
    public LocalContainerEntityManagerFactoryBean entityManagerFactory(){
       // stripped code for question readability
    }

    // more app config code below etc

}

单元测试示例。

 @RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes={AppConfiguration.class})
@Transactional
@TransactionConfiguration(defaultRollback = true)
@WebAppConfiguration
public class ExampleDaoTest {

    @Autowired
    ExampleDao exampleDao;

    @Test
    public void testExampleDao() {
        List<Example> items = exampleDao.findAll();
        Assert.assertTrue(items.size()>0);
    }
}

原文由 Robbo_UK 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1k
2 个回答

如果您不想使用配置文件,您可以添加启用/禁用应用程序调度的标志

在你的 AppConfiguration 添加这个

  @ConditionalOnProperty(
     value = "app.scheduling.enable", havingValue = "true", matchIfMissing = true
  )
  @Configuration
  @EnableScheduling
  public static class SchedulingConfiguration {
  }

在您的测试中只需添加此注释即可禁用调度

@TestPropertySource(properties = "app.scheduling.enable=false")

原文由 Marko Vranjkovic 发布,翻译遵循 CC BY-SA 3.0 许可协议

我只是用可配置的延迟时间参数化了我的@Scheduled 注释:

 @Scheduled(fixedRateString = "${timing.updateData}", initialDelayString = "${timing.initialDelay}")

在我的测试 application.yaml 中:

 timing:
    updateData: 60000
    initialDelay: 10000000000

和主要的 application.yaml:

 timing:
    updateData: 60000
    initialDelay: 1

它并没有关闭它,而是造成了如此长的延迟,测试将在它运行之前很久就结束了。不是最优雅的解决方案,但绝对是我发现的最简单的解决方案之一。

原文由 Laila Sharshar 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
logo
Stack Overflow 翻译
子站问答
访问
宣传栏