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

Active profile in SpringBootTest based on system variable

由于redis的host在本地和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(..)获取。所以现在我想知道如何根据我得到的变量激活配置文件。

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

@SpringBootTest
@ActiveProfiles("someProfile")

在 CI job/script 中使用 运行 参数。

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

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

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

或其他。

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

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

不管怎样,在开始时提供活动配置文件将激活您选择的 属性 文件。

如果您希望某些特定代码段(例如配置 class)仅具有特定配置文件 运行,请使用 @Profile("ci-test")[=16= 注释该段代码]

示例:

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

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

还值得补充的是,为了让一些代码在除指定之外的所有配置文件中 运行,您可以在配置文件注释中否定名称,例如:@Profile("!ci-test")

这样注释的代码将 运行 包含除 "ci-test".

之外的所有配置文件(包括默认配置文件)

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

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)

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