在Spring Boot集成测试中覆盖应用程序属性

时间:2016-03-14 11:13:21

标签: spring-boot spring-test

我正准备一个Spring Boot启动器(用于测试),我想覆盖一个特定的应用程序属性。此特定情况涉及基于属性启用/禁用缓存(生产代码启动程序使用@ConditionalOnProperty)。使用测试启动器时,我希望默认禁用缓存。

除了使用@TestPropertySource之外,还有办法吗?因此,它不是一个可重复的注释,我不想使用它。这是最终用户添加测试用例所需属性的推荐方法。

编辑: 我提供了有关特定用例的更多详细信息

生产启动器自动配置:

@Configuration
@ConditionalOnWebApplication
@EnableConfigurationProperties(StarterCacheProperties.class)
@EnableCaching
public class StarterCacheAutoConfiguration {

..(omitted for clarity)..

@Configuration
@ConditionalOnProperty(prefix = "neostarter.saasmgr.cache", name = "enabled", havingValue = "false")
public static class SaasMgrNoCacheConfig extends CachingConfigurerSupport {

    @Bean(name = SAAS_MGR_CACHE_MANAGER)
    @Override
    public CacheManager cacheManager() {
        return new NoOpCacheManager();
    }
}

@Configuration
@ConditionalOnProperty(prefix = "neostarter.saasmgr.cache", name = "enabled", matchIfMissing = true)
public static class SaasMgrCachingConfig extends CachingConfigurerSupport {

    @Autowired
    SaasMgrCacheProperties saasMgrCacheProperties;

    @Bean(destroyMethod = "shutdown")
    public net.sf.ehcache.CacheManager ehCacheManager() {
        CacheConfiguration cacheConfiguration = new CacheConfiguration(SAAS_MGR_AUTH_CACHE, 1000)
                .timeToLiveSeconds(saasMgrCacheProperties.getTimeToLiveSeconds());

        net.sf.ehcache.config.Configuration config = new net.sf.ehcache.config.Configuration();
        config.addCache(cacheConfiguration);

        return net.sf.ehcache.CacheManager.newInstance(config);
    }

    @Bean(name = SAAS_MGR_CACHE_MANAGER)
    @Override
    public CacheManager cacheManager() {
        return new EhCacheCacheManager(ehCacheManager());
    }
}

这使用户可以选择在生产中缓存特定的调用(或不缓存)。但是,我发现默认情况下禁用测试中的缓存是合理的。我完全清楚这仍然可以被最终用户覆盖。在测试启动器(不同依赖)中,我尝试了以下内容:

@Configuration
@AutoConfigureBefore({CacheAutoConfiguration.class, SaasMgrSecurityAutoConfiguration.class})
public class DisableCacheAutoConfiguration {

    @Autowired
    Environment environment;

    @PostConstruct
    public void disableCache() {
        EnvironmentTestUtils.addEnvironment((ConfigurableEnvironment)environment, "neostarter.saasmgr.cache.enabled=false");
    }
}

但无论StarterCacheAutoConfigurationEhCacheCacheManager之间的DisableCacheAutoConfiguration总是在15 = "com.neoteric.starter.auth.saasmgr.test.DisableCacheAutoConfiguration" 16 = "com.neoteric.starter.auth.SaasMgrSecurityAutoConfiguration" 36 = "org.springframework.boot.autoconfigure.cache.CacheAutoConfiguration" 之前得到解决。在AutoConfigurationSorter.java中的调试中,我看到了正确的配置顺序:

.htaccess

1 个答案:

答案 0 :(得分:0)

您无法在启动器中更改用户的配置,这将太不透明和侵入性。无论如何,您无法保证:任何人都可以将属性值设置为更高级别(例如系统属性)并覆盖您尝试更改的内容。

如果要禁用缓存,最简单的方法是执行spring.cache.type=none所做的事情,即提供CacheManager的实现,但不执行任何操作。

尝试声明类型为org.springframework.cache.support.NoOpCacheManager

的bean