@IfProfileValue 从环境变量导入设置,测试不执行
@IfProfileValue import set from env variable, test not executing
作为 的跟进,如果我想用 @IfProfileValue
执行此操作
@RunWith(SpringJUnit4ClassRunner.class)
...
@Resource ConfigurableEnvironment env;
@Before
public void env () {
log.debug( "profiles {} {}", env.getDefaultProfiles(), env.getActiveProfiles());
}
@Test
@IfProfileValue( name = "integration" )
public void testExecute() throws JobExecutionException
{...}
日志的输出是 profiles [default] [integration]
,但是 testExecute
被忽略了,当我启用集成时,我错过了什么才能让这个测试达到 运行。我目前通过在 IDEA 的测试 运行ner.
中设置 SPRING_PROFILES_ACTIVE=integration
来启用它
首先:您需要使用 SpringJUnit4ClassRunner
并使用 > 4.9 的 junit 版本。
注释名称有点违反直觉:它检查 ProfileValueSource
中的键值。默认情况下,只有 SystemProfileValue
源由 spring 配置,提供对系统属性的访问。
您可以提供自己的 ProfileValueSource
来检查配置文件是否处于活动状态并将其配置为使用 ProfileValueSourceConfiguration
。
如果您的用例是将集成测试分开并且您正在使用 Maven,请考虑使用故障安全插件并分开测试,甚至可能在不同的模块中。
我有一个简短的例子,由于在很早的阶段需要考虑测试 类,它只适用于系统属性。既然你说你无论如何都使用它,你可能会对它感到满意。对于实际情况(CI 服务器等),您应该使用更强大的方法,如故障安全插件和支持单独集成测试的构建系统。
@RunWith(SpringJUnit4ClassRunner.class)
@ProfileValueSourceConfiguration(ProfileTest.ProfileProfileValueSource.class)
@SpringApplicationConfiguration(classes = ProfileTest.class)
//won't work since not added to system properties!
//@ActiveProfiles("integration")
public class ProfileTest
{
@Test
public void contextLoads()
{
}
@IfProfileValue( name = "integration", value = "true")
@Test
public void runInIntegration()
{
throw new RuntimeException("in integration");
}
@Test
public void runDemo()
{
System.out.println("DEMO, running always");
}
public static class ProfileProfileValueSource implements ProfileValueSource
{
@Override
public String get(String string)
{
final String systemProfiles = System.getProperty("spring.profiles.active", System.getProperty("SPRING_PROFILES_ACTIVE", ""));
final String[] profiles = systemProfiles.split(",");
return Arrays.asList(profiles).contains(string) ? "true" : null;
}
}
}
作为 @IfProfileValue
@RunWith(SpringJUnit4ClassRunner.class)
...
@Resource ConfigurableEnvironment env;
@Before
public void env () {
log.debug( "profiles {} {}", env.getDefaultProfiles(), env.getActiveProfiles());
}
@Test
@IfProfileValue( name = "integration" )
public void testExecute() throws JobExecutionException
{...}
日志的输出是 profiles [default] [integration]
,但是 testExecute
被忽略了,当我启用集成时,我错过了什么才能让这个测试达到 运行。我目前通过在 IDEA 的测试 运行ner.
SPRING_PROFILES_ACTIVE=integration
来启用它
首先:您需要使用 SpringJUnit4ClassRunner
并使用 > 4.9 的 junit 版本。
注释名称有点违反直觉:它检查 ProfileValueSource
中的键值。默认情况下,只有 SystemProfileValue
源由 spring 配置,提供对系统属性的访问。
您可以提供自己的 ProfileValueSource
来检查配置文件是否处于活动状态并将其配置为使用 ProfileValueSourceConfiguration
。
如果您的用例是将集成测试分开并且您正在使用 Maven,请考虑使用故障安全插件并分开测试,甚至可能在不同的模块中。
我有一个简短的例子,由于在很早的阶段需要考虑测试 类,它只适用于系统属性。既然你说你无论如何都使用它,你可能会对它感到满意。对于实际情况(CI 服务器等),您应该使用更强大的方法,如故障安全插件和支持单独集成测试的构建系统。
@RunWith(SpringJUnit4ClassRunner.class)
@ProfileValueSourceConfiguration(ProfileTest.ProfileProfileValueSource.class)
@SpringApplicationConfiguration(classes = ProfileTest.class)
//won't work since not added to system properties!
//@ActiveProfiles("integration")
public class ProfileTest
{
@Test
public void contextLoads()
{
}
@IfProfileValue( name = "integration", value = "true")
@Test
public void runInIntegration()
{
throw new RuntimeException("in integration");
}
@Test
public void runDemo()
{
System.out.println("DEMO, running always");
}
public static class ProfileProfileValueSource implements ProfileValueSource
{
@Override
public String get(String string)
{
final String systemProfiles = System.getProperty("spring.profiles.active", System.getProperty("SPRING_PROFILES_ACTIVE", ""));
final String[] profiles = systemProfiles.split(",");
return Arrays.asList(profiles).contains(string) ? "true" : null;
}
}
}