基于系统变量的 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.yml
和applicaiton-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" };
}
}
然后在@ActiveProiles中使用参数resolver
:
@ActiveProfiles(resolver = SpringActiveProfileResolver.class)
如何设置环境变量是另一个问题,上面的答案已经回答了
由于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.yml
和applicaiton-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" };
}
}
然后在@ActiveProiles中使用参数resolver
:
@ActiveProfiles(resolver = SpringActiveProfileResolver.class)
如何设置环境变量是另一个问题,上面的答案已经回答了