我有一个带有弹簧启动的Java Web应用程序
运行测试时,我需要排除一些Java配置文件:
测试配置(测试运行时需要包含):
@TestConfiguration
@PropertySource("classpath:otp-test.properties")
public class TestOTPConfig { }
生产配置(测试运行时需要排除):
@Configuration
@PropertySource("classpath:otp.properties")
public class OTPConfig { }
测试类(使用显式配置类):
@RunWith(SpringRunner.class)
@SpringBootTest(classes = TestAMCApplicationConfig.class)
public class AuthUserServiceTest { .... }
测试配置:
@TestConfiguration
@Import({ TestDataSourceConfig.class, TestMailConfiguration.class, TestOTPConfig.class })
@TestPropertySource("classpath:amc-test.properties")
public class TestAMCApplicationConfig extends AMCApplicationConfig { }
也有课程:
@SpringBootApplication
public class AMCApplication { }
当测试正在运行OTPConfig
时,我需要TestOTPConfig
...
我该怎么做?
答案 0 :(得分:10)
通常,您可以使用Spring配置文件来包含或排除Spring bean,具体取决于哪个配置文件处于活动状态。在您的情况下,您可以定义生产配置文件,默认情况下可以启用;和测试配置文件。在生产配置类中,您将指定生产配置文件:
@Configuration
@PropertySource("classpath:otp.properties")
@Profile({ "production" })
public class OTPConfig {
}
测试配置类将指定测试配置文件:
@TestConfiguration
@Import({ TestDataSourceConfig.class, TestMailConfiguration.class, TestOTPConfig.class })
@TestPropertySource("classpath:amc-test.properties")
@Profile({ "test" })
public class TestAMCApplicationConfig extends AMCApplicationConfig {
}
然后,在您的测试类中,您应该能够说出哪些配置文件处于活动状态:
@RunWith(SpringRunner.class)
@SpringBootTest(classes = TestAMCApplicationConfig.class)
@ActiveProfiles({ "test" })
public class AuthUserServiceTest {
....
}
当您在生产中运行项目时,您可以通过设置环境变量将“production”包含为默认的活动配置文件:
JAVA_OPTS="-Dspring.profiles.active=production"
当然,您的生产启动脚本可能会使用除JAVA_OPTS之外的其他内容来设置Java环境变量,但不知何故,您应该设置spring.profiles.active
。
答案 1 :(得分:4)
您也可以仅模拟不需要的配置。例如:
@MockBean
private AnyConfiguration conf;
将其放入测试班级。这应该有助于避免加载真实的AnyConfiguration
。
答案 2 :(得分:2)
您也可以使用@ConditionalOnProperty
,如下所示:
@ConditionalOnProperty(value="otpConfig", havingValue="production")
@Configuration
@PropertySource("classpath:otp.properties")
public class OTPConfig { }
和测试:
@ConditionalOnProperty(value="otpConfig", havingValue="test")
@Configuration
@PropertySource("classpath:otp-test.properties")
public class TestOTPConfig { }
在main/resources/config/application.yml
otpConfig: production
并在test/resources/config/application.yml
otpConfig: test
答案 3 :(得分:1)
另外,为了排除自动配置:
@EnableAutoConfiguration(exclude=CassandraDataAutoConfiguration.class)
public class // ...
答案 4 :(得分:0)
我最简单的使用方法-
@ConditionalOnProperty
放入我的主要源代码中。 Voila!
答案 5 :(得分:-1)
您可以在配置类中使用@ConditionalOnMissingClass("org.springframework.test.context.junit4.SpringJUnit4ClassRunner")
。SpringJUnit4ClassRunner
可以由仅在测试环境中退出的任何类替换。