SpringBootTest中基于系统变量的活动配置文件

时间:2018-12-21 11:39:35

标签: spring-boot redis continuous-integration spring-boot-test rate-limiting

由于Redis的主机在本地和CI中不同,因此我的@Test可以在本地通过,而不能在CI中通过。

首先,我试图像这样模拟RedisTemplate

RedisTemplate redisTemplate = mock(RedisTemplate.class);
ValueOperations valueOperations = mock(ValueOperations.class);
when(redisTemplate.opsForValue()).thenReturn(valueOperations);
when(valueOperations.increment(anyString(), anyLong())).thenReturn(1L);
when(valueOperations.get("a@a.com")).thenReturn("1");

它确实嘲笑了RedisTemplate,但不能嘲笑redisTemplate.opsForValue()valueOperations.increment(...)(我找不到原因)

然后,我写了两个名为application-ci-test.ymlapplicaiton-test.yml的配置文件,试图根据系统环境变量激活其中一个

我从here获悉,可以通过以下方式设置有效个人资料:

@Configuration
public class MyWebApplicationInitializer 
  implements WebApplicationInitializer {

    @Override
    public void onStartup(ServletContext servletContext) throws ServletException {

        servletContext.setInitParameter(
          "spring.profiles.active", "dev");
    }
}

以这种方式:

@Autowired
private ConfigurableEnvironment env;
...
env.setActiveProfiles("someProfile");

但是我不知道如何使用它们。系统变量可以通过System.getenv(..)获得。所以现在我想知道如何根据我得到的变量来激活配置文件。

3 个答案:

答案 0 :(得分:0)

假设您的@Test方法在带有@SpringBootTest批注的类中,则可以使用@ActiveProfiles来设置配置文件。

@SpringBootTest
@ActiveProfiles("someProfile")

答案 1 :(得分:0)

在CI作业/脚本中使用运行参数。

根据您开始测试的方式,例如,可以使用VM参数

mvn test -Dspring.profiles.active=ci-test

java -jar -Dspring.profiles.active=ci-test

或其他。

另一方面,您可以使用程序参数:

java -jar --spring.profiles.active=ci-test

以一种或另一种方式在启动时提供活动的配置文件将激活您选择的属性文件。

如果您只想使用特定的配置文件运行某些特定的代码段(例如,配置类),请使用@Profile("ci-test")

注释该段代码

示例:

@Configuration
@Profile("ci-test")
public class SomeConfiguration {
   //any configuration beans etc.
}

仅当您的活动配置文件为“ ci-test”时,才会加载以下课程。因此,如果您使用上述命令之一在CI服务器上运行您的应用程序,则将加载名为“ ci-test”的属性文件和此配置类。

还值得补充的是,为了使某些代码在指定的所有概要文件中运行,您可以对概要文件注释中的名称取反,例如:@Profile("!ci-test")

这样注释的代码将与除“ ci-test”之外的所有配置文件(包括默认配置文件)一起运行。

答案 2 :(得分:0)

我找到了一种基于系统变量或属性来激活相应配置文件的方法:

import org.springframework.test.context.ActiveProfilesResolver;

public class SpringActiveProfileResolver implements ActiveProfilesResolver {
    @Override
    public String[] resolve(Class<?> testClass) {
        final String isCITest = System.getEnv("isCITest");
        return new String[] { isCITest == null ? "test" : "ci-test" };
    }
} 

然后在@Act​​iveProiles中使用参数resolver

@ActiveProfiles(resolver = SpringActiveProfileResolver.class)

如何设置环境变量是另一个问题,上面的答案已经回答了